2016-07-28 48 views
-1

我想了解如何使用CryptoJS的AES加密一些数据。我使用JavaScript制作了一个简单的HTML页面,以查看CryptoJS AES的行动。CryptoJS密码短语,盐和iv无关紧要?

起初我以为加密/解密是完美的。但后来我试图改变密码,盐和IV。我发现,给定相同的消息,无论我如何更改密码,盐和IV,生成的密文都是相同的。

我下载aes.jspbkdf2.jshttps://code.google.com/archive/p/crypto-js/downloads V3.1.2并提到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> 

任何帮助将不胜感激!

+0

'“myIV”'不是十六进制,为什么要解析它呢?这可能会导致null,这将始终是相同的... – dandavis

+0

dandavis是正确的,但真正的问题是'this.keySize'为空。因此,无论参数如何,'key'都将保持不变。你必须使用'new'关键字来使用'this' –

+0

谢谢@dandavis和@ artjom-b!我用Utf8解析salt和iv,并且改变了密钥大小和迭代次数以不使用'this'。现在,当我改变这些值时,密文也会改变! – hollaholl

回答

0

我接受了@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值。