javascript - PHP 在 JavaScript 中使用 CryptoJS openssl_encrypt

标签 javascript encryption encoding cryptojs

我在用 JavaScript 生成与第三方 PHP 服务器提供的密文相同的密文时遇到问题。服务器端使用简单的单行代码生成 key ,但我找不到在我的 JavaScript 客户端中执行相同操作的方法。

我决定使用来自 other SO answers 的 CryptoJS 库,我确实生成了一个密文,但它与来自 PHP 服务器的密文不同。

PHP 加密:

echo openssl_encrypt("5905","AES-256-CBC","FbcCY2yCFBwVCUE9R+6kJ4fAL4BJxxjdRcqy5rHVLwU=",NULL,"e16ce913a20dadb8");
// phgygAJB3GA0sa4D9k/d8A==

我尝试了 Stack Overflow 中的几种解决方案,但都未能创建相同的密文。

此外,PHP 单行代码中的参数“AES-256-CBC”让我很困扰:我知道 AES 是什么,但我不知道那些 256 或 CBC 部分是什么,而且我不知道去哪里在 CryptoJS 端设置它们。

我目前的尝试:

var key = 'FbcCY2yCFBwVCUE9R+6kJ4fAL4BJxxjdRcqy5rHVLwU=';
var iv = 'e16ce913a20dadb8';
var encrypted = CryptoJS.AES.encrypt("5905", CryptoJS.enc.Hex.parse(key), { iv: CryptoJS.enc.Hex.parse(iv) });
var r1 = encrypted.ciphertext.toString(); // def44f8822cfb3f317a3c5b67182b437
var r2 = CryptoJS.enc.Base64.stringify(encrypted.ciphertext) // 3vRPiCLPs/MXo8W2cYK0Nw==

我的猜测是我在 JavaScript 的某处缺少“256”和“CBC”参数。

最佳答案

您的“ key ”有 44 个字符长,在 PHP 中也等于 44 个字节。这不是有效的 key 大小。 AES 仅支持 16、24 和 32 字节 key 。无论如何,这个“ key ”将被 chop 为 32 字节。所以你在 PHP 中的实际关键是:

"FbcCY2yCFBwVCUE9R+6kJ4fAL4BJxxjd"

您的 IV 长度为 16 个字符(和字节),因此它具有正确的长度并按原样使用。

这也是您可以将 CryptoJS 中的 key 和 IV 视为字符串的原因:

CryptoJS.AES.encrypt("5905", CryptoJS.enc.Utf8.parse(key), { iv: CryptoJS.enc.Utf8.parse(iv) });

但是正确的方法是从 Base64 解码 key 并生成适当的 IV,当编码为 Hex 时,它的长度是原来的两倍。使用前应从十六进制解码。

IV 必须是不可预测的(读作:随机)。不要使用静态 IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定之前发送相同消息前缀的时间。 IV 不是 secret 的,因此您可以将它与密文一起发送。通常,它只是简单地添加到密文之前并在解密之前被切掉。

关于javascript - PHP 在 JavaScript 中使用 CryptoJS openssl_encrypt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45082597/

相关文章:

javascript - JQuery 获取 XML 的一部分

javascript - 在 jquery 循环中将数字添加到运行总计中

java - 如何保护 Kryonet (SSLSocketChannel)

android - 加密 Android 设备上的信息(合理防止用户访问)

java - 如何读取非 ASCII 文件?

javascript - 将 facebook token 从客户端发送到服务器的正确方法

javascript - jquery AOP :Define many targets for the same method name with the same advise

javascript - Rsaencrypt 和奇怪的 Javascript 函数(e,t,r,n,c,a,l)

python - Unicode解码错误: 'utf-8' codec can't decode byte 0x80

php - Mac和Windows上传文件名编码不同的问题