javascript - CryptoJS 密码、盐和 iv 不重要吗?

标签 javascript encryption aes cryptojs

我试图了解如何使用 CryptoJS 的 AES 来加密一些数据。我使用 JavaScript 制作了一个简单的 HTML 页面来查看 CryptoJS AES 的运行情况。

起初我认为加密/解密工作得很好。但后来我尝试更改密码、盐和 IV。我发现,给定相同的消息,无论我如何更改密码、盐和 IV,生成的密文都是相同的。

我从 https://code.google.com/archive/p/crypto-js/downloads 的 v3.1.2 下载了 aes.jspbkdf2.js并引用https://github.com/mpetersen/aes-example

这是我的完整 HTML(因为这是一个非常简单的页面,我认为可以发布整个内容)

<!DOCTYPE html>

<head>
    <title>Decryptor</title>
</head>

<body>
    <input type="text" id="inputElement" />
    <button id="decrypt">Decrypt!</button>
    <br />
    <p id="ciphertext">
        Ciphertext
    </p>
    <p id="plaintext">
        Plaintext
    </p>
</body>

<script src="aes.js"></script>
<script src="pbkdf2.js"></script>

<script type="text/javascript">
    function decrypt() {
        var input = document.getElementById("inputElement").value;
        var ciphertextElement = document.getElementById("ciphertext");
        var plaintextElement = document.getElementById("plaintext");

        var message = input;
        var passphrase = "myPassphrase";
        var salt = "mySalt";
        var iv = "myIV";

        var key = CryptoJS.PBKDF2(
            passphrase,
            CryptoJS.enc.Hex.parse(salt),
            { keySize: this.keySize, iterations: this.iterationCount }
        );

        var parsedIV = CryptoJS.enc.Hex.parse(iv);

        var encrypted = CryptoJS.AES.encrypt(
            message,
            key,
            { iv: parsedIV }
        );

        var ciphertext = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
        ciphertextElement.innerHTML = ciphertext;

        var cipherParams = CryptoJS.lib.CipherParams.create(
            { ciphertext: CryptoJS.enc.Base64.parse(ciphertext) }
        );
        var decrypted = CryptoJS.AES.decrypt(
            cipherParams,
            key,
            { iv: parsedIV }
        );

        var plaintext = decrypted.toString(CryptoJS.enc.Utf8);
        plaintextElement.innerHTML = plaintext;
    }

   var decryptionButton = document.getElementById("decrypt");
    decryptionButton.onclick = decrypt;
</script>

</html>

最佳答案

我听取了 @dandavis 和 @artjom-b 的建议。

因为我的 salt 和 iv 是字符串,所以我用 Utf8 解析它们:

CryptoJS.enc.Utf8.parse(salt);
CryptoJS.enc.Utf8.parse(iv);

对于 key 生成,我使用静态值:

        var key = CryptoJS.PBKDF2(
        passphrase,
        CryptoJS.enc.Utf8.parse(salt),
        { keySize: 512/32, iterations: 1000 }
    );

现在,当我更改密码、salt 和 iv 值时,密文也会发生变化。

关于javascript - CryptoJS 密码、盐和 iv 不重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38627413/

相关文章:

javascript - 信用卡支付可以用JS加密代替SSL吗?

javascript - C - tiny-aes-c 和 Javascript CryptoJS 互操作性

objective-c - 针对 iPhone 使用 AES 的非对称加密

没有填充的 Java AES

javascript - 保留空白,忽略换行符

java - 为什么我需要在这个加密中使用 Base64

javascript - cookie 是否可以保护 token 免受 XSS 攻击?

ios - Objective-C : Unable to fetch SecKeyRef from PEM private key

javascript - Reactjs-Redux : Clearing forms without redux-form

javascript - Adobe Animate HTML5 Canvas 问题仅适用于 Google Chrome。动画滞后