我正在使用PHP和Nodejs使用OpenSSL进行对称加密。 PHP使用OpenSSL库,Node.js解密基于实现的加密。问题是Node.js中的解密文本仅部分正确。
function encrypt($text, $pw, $base64 = true) {
$method = 'aes-256-cbc';
$iv_len = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($iv_len);
$pw = substr(md5($pw),0,32);
$cipher = openssl_encrypt ($text ,$method ,$pw ,!$base64 ,$iv );
if($base64) {
$pw = base64_encode($pw);
$iv = base64_encode($iv);
}
return array(
'iv' => $iv,
'pw' => $pw,
'text' => $text,
'cipher' => $cipher
);
}
var cipher = new Buffer(data.cipher, 'base64');
var iv = new Buffer(data.iv, 'base64');
// the password is the same returned by the php function, so 100% correct
var key = new Buffer(data.pw, 'base64');
var dec = crypto.createDecipheriv('aes-256-cbc',key,iv);
var dec_data = dec.update(cipher,'binary','utf8');
// the script is based on socket.io
socket.emit('debug',{decrypted : dec_data});
# Encrypting in php...
>> encrypt('1. Lorem ipsum dolor sit amet! 2. Lorem ipsum dolor sit amet!', 'password');
# ...makes nodejs giving me something like
>> 1, 6+r@o ipsum /olor sit amet! 2. Lorem ipsum do
我猜这个问题可能与填充有关 - 但说实话:我不知道。
感谢您阅读帮助!
答案 0 :(得分:2)
在您的节点代码中,您缺少消息的最终部分:
var dec = crypto.createDecipheriv('aes-256-cbc',key,iv);
var dec_data = dec.update(cipher,'base64','utf8') + dec.final('utf8');
另外,使用 base64 进行解码,而不是二进制(因为它可能会落入这里提到的场景中https://stackoverflow.com/a/8770975/3739618)
我有这个示例代码在另一篇文章中工作,请查看: https://stackoverflow.com/a/28181444/3739618
此致 伊格纳西奥