2016-07-28 3 views
-1

Я пытаюсь понять, как использовать AES CryptoJS для шифрования некоторых данных. Я сделал простую HTML-страницу с JavaScript, чтобы увидеть CryptoJS AES в действии.CryptoJS кодовая фраза, соль и iv не имеют значения?

Сначала я думал, что шифрование/дешифрование работает отлично. Но потом я попытался изменить кодовую фразу, соль и IV. Я узнал, что, учитывая одно и то же сообщение, полученный зашифрованный текст идентичен независимо от того, как я изменяю кодовую фразу, соль и IV.

Я скачал aes.js и pbkdf2.js от v3.1.2 из https://code.google.com/archive/p/crypto-js/downloads и называют 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 "' не hex, зачем разбирать его как таковой? что может привести к нулевому значению, которое всегда будет одинаковым ... – dandavis

+0

dandavis верен, но реальная проблема заключается в том, что 'this.keySize' равно null. Таким образом, «ключ» всегда будет одинаковым независимо от параметров. Вы должны использовать ключевое слово 'new' для использования' this' –

+0

Спасибо @dandavis и @ artjom-b! Я проанализировал соль и iv с помощью Utf8, а также изменил ключи и итерации, чтобы не использовать '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 значения.