-1
我想了解如何使用CryptoJS的AES加密一些數據。我使用JavaScript製作了一個簡單的HTML頁面,以查看CryptoJS AES的行動。CryptoJS密碼短語,鹽和iv無關緊要?
起初我以爲加密/解密是完美的。但後來我試圖改變密碼,鹽和IV。我發現,給定相同的消息,無論我如何更改密碼,鹽和IV,生成的密文都是相同的。
我下載aes.js
和pbkdf2.js
從https://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>
任何幫助將不勝感激!
'「myIV」'不是十六進制,爲什麼要解析它呢?這可能會導致null,這將始終是相同的... – dandavis
dandavis是正確的,但真正的問題是'this.keySize'爲空。因此,無論參數如何,'key'都將保持不變。你必須使用'new'關鍵字來使用'this' –
謝謝@dandavis和@ artjom-b!我用Utf8解析salt和iv,並且改變了密鑰大小和迭代次數以不使用'this'。現在,當我改變這些值時,密文也會改變! – hollaholl