CryptoJS PBKDF2 + AES转换为PHP

问题描述 投票:0回答:1

我尝试将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行

php cryptojs
1个回答
0
投票

$ 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

© www.soinside.com 2019 - 2024. All rights reserved.