У меня есть проблема, которую я не могу понять. Я запрограммировал некоторый код для шифрования данных в JS с помощью Crypto JS и для расшифровки этих данных в PHP с помощью OpenSSL. Иногда это работает, но большую часть времени он ломается
Код:
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 или посмотреть, отличается ли что-то еще, но, как указано выше, только шифр не имеет смысла все время.