【问题标题】:Encrypt string with PLSQL then decrypt with PHP用 PLSQL 加密字符串,然后用 PHP 解密
【发布时间】:2014-10-15 18:09:54
【问题描述】:

我有一个应用程序,我尝试使用 PLSQL (dbms_crypto.encrypt) 加密字符串,将其保存到 cookie,然后使用 PHP (mcrypt_decrypt) 读取 cookie 并解密字符串。我有一段时间让字符串解密。希望以前有人这样做过并且可以帮助我吗?

这是 PLSQL 代码:(在 Oracle 11 中运行)

set serveroutput on

set linesize 121

DECLARE
 cookieInfo VARCHAR2(500) := 'Cookie@Data@Goes@Here';
 cookieInfo_raw RAW(500) := utl_raw.cast_to_raw(cookieInfo);
 l_key     RAW(128) := utl_raw.cast_to_raw('abcdefgh');

 l_encrypted_raw RAW(2048);
BEGIN
  dbms_output.put_line('Original : ' || cookieInfo);

  l_encrypted_raw := dbms_crypto.encrypt(cookieInfo_raw,
  dbms_crypto.des_cbc_pkcs5, l_key);

  dbms_output.put_line('Encrypted : ' ||
  l_encrypted_raw);

END;
/

如果我没看错,数据是使用 DES 和 CBC 和 PKCS5 加密的。这是代码的输出:

Original : Cookie@Data@Goes@Here
Encrypted : 3CB6F761112AE388DDA1AE973042D08472B06C2170587D5E

PHP 显然使用 MCRYPT_decode,但我似乎无法正确输出。我拼凑了一个完成部分工作的脚本,但输出看起来总是编码的。我的问题是我并没有真正了解所有选项的真正含义。 CBC 和 PKCS5 对我来说有点希腊化。问题的一部分似乎也可能是文本编码(HEX vs RAW / BIN)。我想我只是糊涂了。

这是我的 PHP 代码:(在 PHP 5.3.10 上运行)

<?php
    $input = "Matt@Danskine@L00579796";
    $key = "abcdefgh";
    $data = "DC979D2F301CA90A548B2F749237B5AF783F13A8CBECE03C";
    $iv = "";

    $decrypt = mcrypt_decrypt(MCRYPT_DES, $key, $data, MCRYPT_MODE_CBC);
    $decrypt = bin2hex($decrypt);

    $block = mcrypt_get_block_size('des', 'cbc');
    echo "BLOCK: ". $block ."<br>";
    $pad = ord($decrypt[($len = strlen($decrypt)) - 1]);
    echo "PAD: ". $pad ."<br>";
    $output = substr($decrypt, 0, strlen($decrypt) - $pad);

    echo "OUTPUT: ". $output;
?>

还有输出:

OUTPUT: 793fe26d587e144f140d70e6013374acb082ff9e411

任何帮助将不胜感激。这个小问题阻碍了一个更大的项目。

提前致谢。

【问题讨论】:

    标签: php encryption plsql mcrypt dbms-crypto


    【解决方案1】:

    您的数据是十六进制的,您需要将其转换回 bin 进行解密。解密后无需转换bin2hex。

    $input = "Matt@Danskine@L00579796";
    $key = "abcdefgh";
    $data = "DC979D2F301CA90A548B2F749237B5AF783F13A8CBECE03C";
    $iv = "";
    
    /*
     * Convert hex to bin data
     * 
     * This code is courtesy of "Johnson"
     * http://php.net/manual/en/function.hex2bin.php#110973
     * Not needed if you have PHP > 5.4
     * Then you can just use hex2bin() builtin
     */
    $data = hextobin($data); 
    
    $decrypt = mcrypt_decrypt(MCRYPT_DES, $key, $data, MCRYPT_MODE_CBC);
    
    $block = mcrypt_get_block_size('des', 'cbc');
    echo "BLOCK: ". $block ."<br>";
    $pad = ord($decrypt[($len = strlen($decrypt)) - 1]);
    echo "PAD: ". $pad ."<br>";
    $output = substr($decrypt, 0, strlen($decrypt) - $pad);
    
    echo "OUTPUT: ". $output;
    
    function hextobin($hexstr)
    {
        $n = strlen($hexstr);
        $sbin="";  
        $i=0;
        while($i<$n)
        {      
            $a =substr($hexstr,$i,2);          
            $c = pack("H*",$a);
            if ($i==0){$sbin=$c;}
            else {$sbin.=$c;}
            $i+=2;
        }
        return $sbin;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 2018-03-18
      • 2020-06-03
      • 2019-06-29
      • 2018-05-19
      • 2011-08-06
      相关资源
      最近更新 更多