2016-07-28 80 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值。