我尝试将CryptoJS转换为PHP,但是在我的代码中出了点问题:
JS
//ciphertext is len:64
var ciphertext = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
var salt = "xxxxxxxxxxxxxxx";
//iv is len:32
var iv = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
salt = CryptoJS['enc']['Hex']['parse'](salt);
iv = CryptoJS['enc']['Hex']['parse'](iv);
var key = CryptoJS['PBKDF2']("testxyz", salt, {
'hasher': CryptoJS.algo.SHA512,
'keySize': 8,
'iterations': 999
});
var decrypt = CryptoJS.AES.decrypt(ciphertext, key, {'iv': iv});
console.log( decrypt.toString(CryptoJS.enc.Utf8) );
PHP(崩溃代码)
$ciphertext = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
$salt = "xxxxxxxxxxxxxxx";
$iv = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
$algo = "sha512";
$password = "testxyz";
$iterations = 999;
$length = 8;
$raw_output = false;
$key = hash_pbkdf2($algo, $password, $salt, $iterations, $length, $raw_output);
echo openssl_decrypt($ciphertext, 'aes-256-cbc', $key, 0, $iv);
警告:openssl_decrypt():传递的IV长32个字节,这更长比所选密码期望的16位截断C:\ xampp \ htdocs \ file.php,第13行
$ iv是一个字节字符串。它的长度取决于您使用的算法。您可以检出算法openssl_cipher_iv_length()
的$ iv长度。当您使用aes-256-cbc
时,将如下所示:
echo openssl_cipher_iv_length('aes-256-cbc'); // 16 bytes
但是您使用的是32个字节。这就是为什么您得到warning的原因。生成$ iv的最佳方法可能是:
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
要查看正在生成的内容,请使用bin2hex()
,如下所示:
echo bin2hex($iv);
有关更多信息,请参阅contribution