我有一个我无法理解的问题。我编写了一些代码,使用CryptoJS加密JS中的数据,并使用OpenSSL解密PHP中的数据。有时它可以正常工作,但大多数情况下会中断
CODE:
PHP JS
$passphrase == passkey
JS:
let data = CryptoJS.AES.encrypt(data, passkey).toString();
send(data);
PHP:
list($cipher, $salt) = decode($_POST["data"]);
list($passkey, $iv) = evpkdf($passphrase, $salt);
$data = openssl_decrypt($cipher, "AES-256-CBC", $passkey, OPENSSL_RAW_DATA, $iv);
echo $data
function evpkdf($passphrase, $salt) {
$salted = "";
$dx = "";
while(strlen($salted) < 48) {
$dx = md5($dx . $passphrase . $salt, true);
$salted .= $dx;
}
$passkey = substr($salted, 0, 32);
$iv = substr($salted, 32, 16);
return [$passkey, $iv];
}
function decode($data) {
$data = base64_decode($data);
if (substr($data, 0, 8) !== "Salted__") {
// throw new \InvalidArgumentException();
echo "no salt\n";
}
$salt = substr($data, 8, 8);
$cipher = substr($data, 16);
return [$cipher, $salt];
}
结果:
PHP JS
iv == iv
salt == salt
cipher ?? cipher
?? = sometimes
我唯一注意到的是,密码长度并不总是一样,而且只有密码具有正确的长度才能起作用。我看不到什么可能是我的错误。我已经尝试了很多,但我真的不知道该怎么办。我试图更改JS中的密码或查看是否有其他区别,但是如上所述,只有密码始终没有意义。
您使用哪种通行密钥来加密数据?
CryptoJS支持AES-128,AES-192和AES-256。它将根据您传入的密钥的大小来选择变体。如果您使用密码短语,它将生成一个256位密钥。