JavaScript 中使用 CryptoJS 和 AES 加密的 AES 加密的不同输出
Different Outputs for AES Encryption using CryptoJS and AES Encryption in JavaScript
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 结果
encryptedData: 97SwKfGtNARERiSYyZxdAQ==
decryptedData:
我查看了您的 PHP 代码。您使用的是 32 个字符的密钥,这显然是十六进制编码的,但您没有将其解码为字节,而是直接使用字符。因此 aes-256-cbc
密码也是错误的。
如果您不想更改具有误导性的 PHP 代码,您可以简单地在 CryptoJS 中犯同样的错误:CryptoJS.enc.Utf8.parse(key)
而不是 CryptoJS.enc.Hex.parse(key)
。
安全注意事项:
IV 必须是不可预测的(读作:随机)。不要使用静态 IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定之前发送相同消息前缀的时间。 IV 不是秘密的,因此您可以将它与密文一起发送。通常,它只是简单地添加到密文中并在解密之前被切掉。
最好对您的密文进行身份验证,以便像 padding oracle attack are not possible. This can be done with authenticated modes like GCM or EAX, or with an encrypt-then-MAC 方案一样进行攻击。
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 结果
encryptedData: 97SwKfGtNARERiSYyZxdAQ==
decryptedData:
我查看了您的 PHP 代码。您使用的是 32 个字符的密钥,这显然是十六进制编码的,但您没有将其解码为字节,而是直接使用字符。因此 aes-256-cbc
密码也是错误的。
如果您不想更改具有误导性的 PHP 代码,您可以简单地在 CryptoJS 中犯同样的错误:CryptoJS.enc.Utf8.parse(key)
而不是 CryptoJS.enc.Hex.parse(key)
。
安全注意事项:
IV 必须是不可预测的(读作:随机)。不要使用静态 IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定之前发送相同消息前缀的时间。 IV 不是秘密的,因此您可以将它与密文一起发送。通常,它只是简单地添加到密文中并在解密之前被切掉。
最好对您的密文进行身份验证,以便像 padding oracle attack are not possible. This can be done with authenticated modes like GCM or EAX, or with an encrypt-then-MAC 方案一样进行攻击。