【问题标题】:Different Outputs for AES Encryption using CryptoJS and AES Encryption in JavaScript在 JavaScript 中使用 CryptoJS 和 AES 加密的 AES 加密的不同输出
【发布时间】:2016-12-17 19:53:27
【问题描述】:

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:

【问题讨论】:

    标签: javascript php ruby encryption cryptojs


    【解决方案1】:

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

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


    安全注意事项:

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

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

    【讨论】:

    • 非常感谢您的回复。
      因为我对加密/解密的东西不是很熟悉。所以,我可能会犯这个错误。
      无论如何,让我稍后再试一下,看看它是否有效。
      PS:随机IV将在功能测试后和推送到生产环境之前使用。
    • 顺便说一句,我已经测试过了。有用。先谢谢了。我稍后会加强它。有什么建议吗? @Artjom B.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多