【发布时间】:2017-08-19 03:58:18
【问题描述】:
当 PHP 中没有声明 IV 并且使用了不合规的密钥长度时,如何在 JavaScript 中匹配 openssl_encrypt 的输出?
PHP
php -r '$value = openssl_encrypt("test", "AES-128-CBC", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); echo $value;'
/u+5lB/VwbMX9U1YY4cnCQ==
JavaScript
iv = CryptoJS.enc.Utf8.parse("");
var encrypted = CryptoJS.AES.encrypt("test", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa", {iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7});
console.log(encrypted.toString());
U2FsdGVkX19Cn1f6x8C/rJdfwzsZk5m5WWCUrR4z3U4=
console.log(CryptoJS.enc.Base64.stringify(encrypted.ciphertext));
l1/DOxmTmblZYJStHjPdTg==
我只能修改 Javascript 代码,我需要一种加密字符串的方法,以便它可以被 PHP 的 openssl_decrypt 解密。如果它是从 PHP 加密的字符串,它显然可以正常工作。
我知道不声明 IV 会降低代码的安全性,但在我的特殊情况下,这不是一个大问题。
我在其他主题中读到 PHP 默认填充为 Pkcs7,这就是我将其添加到 JS 方法的原因。
我目前的理论是,要么是 PHP 的默认 IV 是问题,要么是 JS 函数的输出需要进一步处理。如您所见,我尝试了Base64.stringify 方法,但结果仍然不同。
我在这里使用的示例密钥与实际密钥的长度相同。
我在使用https://github.com/sytelus/CryptoJS/blob/master/rollups/aes.js(无论我在JS中使用什么,它都需要像独立文件一样轻松分发,占用空间相对较小)
【问题讨论】:
标签: javascript php cryptojs php-openssl