我有一个应用程序,我正在尝试使用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;
/
如果我正确读取数据,则使用带有CBC和PKCS5的DES加密数据。这是代码的输出:
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
非常感谢任何帮助。这个小问题正在推动一个更大的项目。
提前致谢。
答案 0 :(得分:0)
您的数据是十六进制的,您需要将其转换回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;
}