带有十六进制密钥的 CryptoJS 无法正确解密

CryptoJS with hex key not decrypting properly

我有一个加密的数据集,我正在尝试使用 CryptoJS 对其进行解密。我尝试了各种组合,但出于某种原因,结果不是我所期望的。我在下面提供了密钥以及我要解密的文本。我在 msg1 中期望的是 32 个字符长,但我一直得到 48 个字符。它用额外的 16 个字符填充它。

在此先感谢您的帮助。

key = 'd13484fc2f28fd0426ffd201bbd2fe6ac213542d28a7ca421f17adc0cf234381';
text = '8bf3955488af91feb7bd87220910cee0';


decrypt(text: string): void{

       let msg1 = CryptoJS.AES.decrypt(text, CryptoJS.enc.Hex.parse(key), { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding});
       msg1 = CryptoJS.enc.Hex.stringify(msg1 );

}

鉴于:
key = 'd13484fc2f28fd0426ffd201bbd2fe6ac213542d28a7ca421f17adc0cf234381';
text = '8bf3955488af91feb7bd87220910cee0';

用密钥解密文本实际产生:C5640000B550000079320000217C0000.

AES Calc

验证 CryptoJS.AES.decrypt 输入和输出编码所需的编码。

解决它很简单,但是阅读文档和代码,我不太清楚为什么。

这显然是错误的:

let msg1 = CryptoJS.AES.decrypt(text, CryptoJS.enc.Hex.parse(key), { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding});

根据您的描述,您希望由十六进制数字“8bf3955488af91feb7bd87220910cee0”表示的字节序列是正文。但这不是你的路过。您正在传递 个字符 。所以当它解密的时候,第一个字节是8(0x38)的ASCII值,而不是0x8b。鉴于此,您应该像这样解析十六进制:

let msg1 = CryptoJS.AES.decrypt(CryptoJS.enc.Hex.parse(text), ...

但是,由于我无法理解的原因,这不起作用。 decrypt 需要 Base64(或者至少它会接受 Base64)。我找不到任何说明这一点的文档,并且代码以我不完全理解的方式神奇地创建了 decrypt 函数,这就是为什么我真的很讨厌在 JavaScript 中进行加密工作.

现在不在我的系统中,所以让我们找到答案:

cipher = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(text))

let msg1 = CryptoJS.AES.decrypt(cipher, CryptoJS.enc.Hex.parse(key), { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding});

这应该会给您预期的结果。