无法使用 Crypto-Js 解密消息
Unable to decrypt message using Crypto-Js
我是加密新手。我想做的是使用 javascript 库 CryptoJS 解密密文。此代码示例工作正常。加密部分returns密文"ae06b481cecfa67c98c125"(正确)同时解密同一个对象returns原始字符串"Hello World".
var key = CryptoJS.enc.Latin1.parse("bad8deadcafef00d");
var iv = CryptoJS.enc.Latin1.parse("bad8deadcafef00d");
var encrypted = CryptoJS.AES.encrypt("Hello World", key, {iv: iv, mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.NoPadding });
alert(encrypted.ciphertext);
var decryptedData = CryptoJS.AES.decrypt(encrypted, key, {iv: iv, mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.NoPadding });
originalData = decryptedData.toString(CryptoJS.enc.Utf8);
alert(originalData);
好吧,这部分工作正常,但是当我通过将密文作为字符串独立传递来尝试这段代码时,我没有得到解密的消息。
var key = CryptoJS.enc.Latin1.parse("bad8deadcafef00d");
var iv = CryptoJS.enc.Latin1.parse("bad8deadcafef00d");
var ciphertext = "ae06b481cecfa67c98c125";
// raw = CryptoJS.enc.Base64.parse(cipher);
var decryptedData = CryptoJS.AES.decrypt(ciphertext, key, {iv: iv, mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.NoPadding });
originalData = decryptedData.toString(CryptoJS.enc.Utf8);
alert(originalData);
console.log(originalData);
有人可以指出原因吗?
我在 html 文件中包含以下库。
<script src="js/rollups/aes.js"></script>
<script src="js/components/mode-ctr.js"></script>
<script src="js/components/pad-nopadding.js"></script>
CryptoJS.AES.decrypt
需要 CipherParams
对象或 OpenSSL 格式的字符串。如果传递的密钥是字符串,则需要 OpenSSL 格式的字符串,否则为 CipherParams
对象。
由于您的密钥不是字符串,因此您需要:
var decryptedData = CryptoJS.AES.decrypt({
ciphertext: CryptoJS.enc.Hex.parse("ae06b481cecfa67c98c125")
}, key, {
iv: iv,
mode: CryptoJS.mode.CTR,
padding: CryptoJS.pad.NoPadding
});
如果密钥是字符串,则它实际上不是密钥,而是假定为密码,并且将从该密码和随机的 8 字节盐派生出密钥。这相当于 OpenSSL 的 EVP_BytesToKey
函数。
我是加密新手。我想做的是使用 javascript 库 CryptoJS 解密密文。此代码示例工作正常。加密部分returns密文"ae06b481cecfa67c98c125"(正确)同时解密同一个对象returns原始字符串"Hello World".
var key = CryptoJS.enc.Latin1.parse("bad8deadcafef00d");
var iv = CryptoJS.enc.Latin1.parse("bad8deadcafef00d");
var encrypted = CryptoJS.AES.encrypt("Hello World", key, {iv: iv, mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.NoPadding });
alert(encrypted.ciphertext);
var decryptedData = CryptoJS.AES.decrypt(encrypted, key, {iv: iv, mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.NoPadding });
originalData = decryptedData.toString(CryptoJS.enc.Utf8);
alert(originalData);
好吧,这部分工作正常,但是当我通过将密文作为字符串独立传递来尝试这段代码时,我没有得到解密的消息。
var key = CryptoJS.enc.Latin1.parse("bad8deadcafef00d");
var iv = CryptoJS.enc.Latin1.parse("bad8deadcafef00d");
var ciphertext = "ae06b481cecfa67c98c125";
// raw = CryptoJS.enc.Base64.parse(cipher);
var decryptedData = CryptoJS.AES.decrypt(ciphertext, key, {iv: iv, mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.NoPadding });
originalData = decryptedData.toString(CryptoJS.enc.Utf8);
alert(originalData);
console.log(originalData);
有人可以指出原因吗?
我在 html 文件中包含以下库。
<script src="js/rollups/aes.js"></script>
<script src="js/components/mode-ctr.js"></script>
<script src="js/components/pad-nopadding.js"></script>
CryptoJS.AES.decrypt
需要 CipherParams
对象或 OpenSSL 格式的字符串。如果传递的密钥是字符串,则需要 OpenSSL 格式的字符串,否则为 CipherParams
对象。
由于您的密钥不是字符串,因此您需要:
var decryptedData = CryptoJS.AES.decrypt({
ciphertext: CryptoJS.enc.Hex.parse("ae06b481cecfa67c98c125")
}, key, {
iv: iv,
mode: CryptoJS.mode.CTR,
padding: CryptoJS.pad.NoPadding
});
如果密钥是字符串,则它实际上不是密钥,而是假定为密码,并且将从该密码和随机的 8 字节盐派生出密钥。这相当于 OpenSSL 的 EVP_BytesToKey
函数。