在JavaScript中使用CryptoJS和AES加密的不同AES加密输出
Different Outputs for AES Encryption using CryptoJS and AES Encryption in JavaScript
这是我的解决方案PHP, Ruby &斯威夫特。
我在测试中使用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结果
encryptedData: 97SwKfGtNARERiSYyZxdAQ==
decryptedData:
我看过你的PHP代码。你使用的是32个字符的密钥,显然是十六进制编码的,但不是解码成字节,而是直接使用字符。因此aes-256-cbc
密码也是错误的。
如果你不想改变你的误导PHP代码,你可以简单地在CryptoJS: CryptoJS.enc.Utf8.parse(key)
而不是CryptoJS.enc.Hex.parse(key)
中犯同样的错误。
安全注意事项:
静脉注射必须是不可预测的(即随机的)。不要使用静态IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定以前发送相同消息前缀的时间。IV不是秘密的,所以你可以把它和密文一起发送。通常,它只是简单地加在密文前面,在解密之前切掉。
最好对你的密文进行身份验证,这样像填充oracle攻击这样的攻击就不可能了。这可以通过GCM或EAX等身份验证模式完成,也可以使用先加密后mac的方案。
相关文章:
- 如何正确使用AES加密
- 使用PKCS7Padding在python和Node.js之间进行AES加密
- 如何将HMAC添加到CryptoJS AES加密中
- react本机AES加密匹配Java解密算法
- javascript中的AES加密和java中的解密
- CryptoJS AES加密不是对称的
- 将 Java AES 加密代码移植到 node.js
- 节点.js使用 AES 加密大文件
- 有人可以帮助我让我的AES加密在Java,Javascript和C#之间工作吗?
- 简单的浏览器对称AES加密
- 使用jquery进行AES加密
- 创建类似cryptoJS的C#256位AES加密
- 在浏览器中的Node和CryptoJS之间使用AES加密时出现问题
- CryptoJS AES加密和JAVA AES解密值不匹配
- 解密一个c# AES加密
- AES加密,Javascript和Php哪个更好
- CryptoJS AES加密的额外参数.如何使用PHP进行复制
- CryptoJS AES加密输出不匹配
- 在JavaScript中使用CryptoJS和AES加密的不同AES加密输出
- nodeJS:can't让加密模块给我正确的AES加密结果