CryptoJS 密码、salt 和 iv 无关紧要?
CryptoJS passphrase, salt, and iv does not matter?
我正在尝试了解如何使用 CryptoJS 的 AES 来加密一些数据。我用 JavaScript 制作了一个简单的 HTML 页面来查看 CryptoJS AES 的运行情况。
起初我认为 encryption/decryption 运行良好。但后来我尝试更改密码、salt 和 IV。我发现,给定相同的消息,无论我如何更改密码、salt 和 IV,生成的密文都是相同的。
我从 https://code.google.com/archive/p/crypto-js/downloads and referred to https://github.com/mpetersen/aes-example
的 v3.1.2 下载了 aes.js
和 pbkdf2.js
这是我的 HTML 的全部内容(因为它是一个非常简单的页面,我认为 post 整个内容都可以)
<!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>
我听取了@dandavis 和@artjom-b 的建议。
因为我的salt和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 }
);
现在密文随着我更改密码、salt 和 iv 值而改变。
我正在尝试了解如何使用 CryptoJS 的 AES 来加密一些数据。我用 JavaScript 制作了一个简单的 HTML 页面来查看 CryptoJS AES 的运行情况。
起初我认为 encryption/decryption 运行良好。但后来我尝试更改密码、salt 和 IV。我发现,给定相同的消息,无论我如何更改密码、salt 和 IV,生成的密文都是相同的。
我从 https://code.google.com/archive/p/crypto-js/downloads and referred to https://github.com/mpetersen/aes-example
的 v3.1.2 下载了aes.js
和 pbkdf2.js
这是我的 HTML 的全部内容(因为它是一个非常简单的页面,我认为 post 整个内容都可以)
<!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>
我听取了@dandavis 和@artjom-b 的建议。
因为我的salt和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 }
);
现在密文随着我更改密码、salt 和 iv 值而改变。