2016-07-28 26 views
-1

Ich versuche zu verstehen, wie man das AES von CryptoJS verwendet, um einige Daten zu verschlüsseln. Ich habe eine einfache HTML-Seite mit JavaScript erstellt, um CryptoJS AES in Aktion zu sehen.CryptoJS Passphrase, Salz und iv spielt keine Rolle?

Zuerst dachte ich, Verschlüsselung/Entschlüsselung funktionierte perfekt. Aber dann habe ich versucht, die Passphrase, Salz und IV zu ändern. Ich habe herausgefunden, dass der resultierende Chiffretext identisch ist, egal wie ich Passphrase, Salz und IV ändere.

heruntergeladen I aes.js und pbkdf2.js von v3.1.2 von https://code.google.com/archive/p/crypto-js/downloads und bezeichnen https://github.com/mpetersen/aes-example

Hier ist mein HTML in seiner Gesamtheit (da es eine wirklich einfache Seite ist Ich denke, es ist okay, die ganze Sache zu schreiben)

<!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> 

Jede Hilfe würde sehr geschätzt werden!

+0

'" myIV "' ist nicht hex, warum es als solches analysieren? das könnte null ergeben, was immer das gleiche wäre ... – dandavis

+0

dandavis ist korrekt, aber das eigentliche Problem ist, dass 'this.keySize' null ist. Also ist die 'Taste' unabhängig von den Parametern immer gleich. Sie müssen das Schlüsselwort 'new' verwenden, um 'this' zu verwenden. –

+0

Danke @dandavis und @ artjom-b! Ich analysierte das Salz und iv mit Utf8 und änderte auch keysize und Iterationen, um 'this' nicht zu verwenden. Wenn ich jetzt die Werte ändere, ändert sich auch der Geheimtext! – hollaholl

Antwort

0

Ich nahm den Rat von @dandavis und @ artjom-b.

Weil mein Salz und iv Zeichenfolge, ich analysieren sie mit Utf8:

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

Und für die Schlüsselerzeugung, verwende ich statische Werte:

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

Und nun die verschlüsselten Text ändert, wie ich ändern die Passphrase-, Salz- und iv-Werte.