我有一个使用 CryptoJS 的 javascript 函数来使用 3DES 密钥加密一个 8 字节的块。该函数正在使用密钥 01010101010101010101010101010101,但它不适用于密钥 ADADADADADAD0101ADADADADADAD0202。 function enc3DES(keyHex){ var block = "040502CFFFFEFDEE"; var encrypted = CryptoJS.DES.encrypt(CryptoJS.enc.Hex.parse(block), CryptoJS.enc.Hex.parse(keyHex), { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); encrypted = encrypted.ciphertext.toString(); return encrypted.substr(0, 8*2).toUpperCase(); }使用上述函数 enc3DES():使用密钥 01010101010101010101010101010101 加密的块 040502CFFFFEFDEE 是 C9478CAA27ABA56A 并且此输出是正确的。但是同一个块 040502CFFFFEFDEE 用密钥 ADADADADAD0101ADADADADADAD0202 加密的块是 A413ABD86D52DFFB 并且这个输出是错误的,正确的应该是 F6A1C5ACA15A50C3。你能帮我理解为什么这个功能只能用第一个键才能正常工作吗?
1 回答
PIPIONE
TA贡献1829条经验 获得超9个赞
3DES(或TripleDES)不是DES。因此
CryptoJS.DES
必须替换为CryptoJS.TripleDES
。3DES 密钥由 3 个串联的 DES 密钥(K1、K2、K3)组成。有三种密钥选项:3TDEA(所有三个密钥都不同)、2TDEA(2 个密钥不同且 K1 = K3)以及所有密钥相同的第三种情况,这给出了与 DES 相同的密文。第一个键
01010101010101010101010101010101
对应第三个选项(所有键相同),键
ADADADADADAD0101ADADADADADAD0202
对应于第二个选项 (2TDEA)。由于 CryptoJS 需要 3DES 一个 24 字节的密钥,因此密钥
010101010101010101010101010101010101010101010101
和
ADADADADADAD0101ADADADADADAD0202ADADADADADAD0101
必须使用。
由于明文和密文的长度相同,所以填充不能为
Pkcs7
。取而代之的Pkcs7
,ZeroPadding
可以使用,或者,如果明文总是块大小(8字节为3DES)的整数倍,NoPadding
。如果填充更改,则可以返回整个密文(而不是子字符串)。
添加回答
举报
0/150
提交
取消