CryptoJS密码,盐和iv无关紧要?

时间:2016-07-28 05:00:34

标签: 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>

1 个答案:

答案 0 :(得分:1)

我接受了@dandavis和@ artjom-b的建议。

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

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

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

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

现在密文在我更改密码,盐和iv值时会发生变化。