无法使用 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 函数。