javascript - 在 JavaScript 中使用 CryptoJS 和 AES 加密的 AES 加密的不同输出

标签 javascript php ruby encryption cryptojs

Here is my solution to PHP, Ruby & Swift.

我在测试中使用 CryptoJS 时遇到了问题。

我的代码是这样的

var data = "Hello World";
var key = "57119C07F45756AF6E81E662BE2CCE62";
var iv = "GsCJsm/uyxG7rBTgBMrSiA==";

var encryptedData = CryptoJS.AES.encrypt(data, 
    CryptoJS.enc.Hex.parse(key), {
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7,
        iv: CryptoJS.enc.Base64.parse(iv) 
    }
);

console.log("encryptedData: " + encryptedData);

// var crypttext = encryptedData.toString();
var crypttext = "k4wX2Q9GHU4eU8Tf9pDu+w==";

var decryptedData = CryptoJS.AES.decrypt({
    ciphertext: CryptoJS.enc.Base64.parse(crypttext) 
}, CryptoJS.enc.Hex.parse(key), {
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7,
    iv: CryptoJS.enc.Base64.parse(iv) 
});

console.log("decryptedData: " + decryptedData);

console.log结果

加密数据:97SwKfGtNARERiSYyZxdAQ==

解密数据:

最佳答案

我查看了您的 PHP 代码。您使用的是 32 个字符的 key ,它显然是十六进制编码的,但您不是将其解码为字节,而是直接使用字符。因此 aes-256-cbc 密码也是错误的。

如果您不想更改误导性的 PHP 代码,您可以在 CryptoJS 中犯同样的错误:CryptoJS.enc.Utf8.parse(key) 而不是 CryptoJS。 enc.Hex.parse(key).

<小时/>

安全考虑:

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

最好对您的密文进行身份验证,以便像padding oracle attack这样的攻击是不可能的。这可以通过 GCM 或 EAX 等身份验证模式或使用 encrypt-then-MAC 来完成。方案。

关于javascript - 在 JavaScript 中使用 CryptoJS 和 AES 加密的 AES 加密的不同输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38890196/

相关文章:

ruby - Active Record - 查找今天之前创建的记录

ruby - watir-webdriver 在保持浏览器打开的同时更改代理

javascript - 使用 Javascript 添加 onClick 函数没有通过

javascript - JSON 数据转换成漂亮的 GUI 表

ruby - Watir ... sleep 和等待之间的区别

php - Facebook 分享的图片和内容错误

php - 使用 updateOrInsert() 方法批量插入/更新并将数组转换为字符串

javascript - CSS:用于触摸屏逆向工程的悬停

javascript - Angular JS应用程序页面刷新问题

php - 使用 Imagick PHP 勾勒透明图像时如何用边框颜色填充封闭区域