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

时间:2018-02-07 21:19:52

标签: node.js encryption cryptojs

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

}

2 个答案:

答案 0 :(得分:1)

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

这显然是错误的:

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});

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

答案 1 :(得分:0)

鉴于


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

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

请参阅AES Calc

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