带有十六进制密钥的 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
.
验证 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});
这应该会给您预期的结果。
我有一个加密的数据集,我正在尝试使用 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
.
验证 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});
这应该会给您预期的结果。