Node.js 带有十六进制密钥的CryptoJS未正确解密

Node.js 带有十六进制密钥的CryptoJS未正确解密,node.js,encryption,cryptojs,Node.js,Encryption,Cryptojs,我有一个加密的数据集,我正试图用CryptoJS解密它。我尝试过各种各样的组合,但由于某些原因,结果并不是我所期望的。我已经提供了下面的密钥和我想要解密的文本。我期望msg1的长度是32个字符,但我一直得到48个字符。它作为它的填充它额外的16个字符 提前谢谢你的帮助 key = 'd13484fc2f28fd0426ffd201bbd2fe6ac213542d28a7ca421f17adc0cf234381'; text = '8bf3955488af91feb7bd87220910cee0'

我有一个加密的数据集,我正试图用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'

使用密钥解密文本实际上会产生:
C5640000B5500000079320000217C0000


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

解决这个问题相当简单,但阅读文档和代码,我不太清楚原因

这显然是错误的:

let msg1 = CryptoJS.AES.decrypt(text, CryptoJS.enc.Hex.parse(key), { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding});
根据您的描述,您希望由十六进制数字“8BF395548AF91FEB7BD87220910CEE0”表示的字节序列是正文。但那不是你的过去。你在传递角色。因此,当它解密时,第一个字节是
8
(0x38)的ASCII值,而不是0x8b。鉴于此,您应该像这样解析十六进制:

let msg1 = CryptoJS.AES.decrypt(CryptoJS.enc.Hex.parse(text), ...
但是,由于我难以理解的原因,这是行不通的<代码>解密
需要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});

这应该会给你你期望的结果。

是的,我知道这应该是正确的答案,但当使用CryptoJS时,我得到的是'71dbf42d47bc84f19e7124393b35d36634aca7fb7f0ba46d'谢谢。它添加了16个字符的填充,因为文本是块倍数,文本
“来自windows的测试数据-mary有一个小羔羊”
有一个尾随空格字符,因此填充会添加一个完整的填充块。不要指定
CryptoJS.pad。NoPadding
在解密时,指定CBC填充。但似乎有一些原始问题和此问题的混合。