我有一个加密的数据集,我试图用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 );
}
答案 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
对其输入和输出编码所需的编码。