我有一个JavaScript函数,使用CryptoJS使用3DES密钥对8bytes块进行加密。
该功能使用键01010101010101010101010101010010101,但不能使用键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():
用密钥01010101010101010010101010101010101加密的块040502CFFFFEFDEE为C9478CAA27ABA56A,此输出正确。
但是使用密钥ADADADADADAD0101ADADADADADAD0202加密的040502CFFFFEFDEE块的同一块是A413ABD86D52DFFB,此输出是错误的,正确的输出是F6A1C5ACA15A50C3。
您能帮我理解为什么只有第一个键才能正常使用该功能吗?
最佳答案
3DES(或TripleDES)不是DES。因此,必须将CryptoJS.DES
替换为CryptoJS.TripleDES
。
3DES密钥由3个串联的DES密钥(K1,K2,K3)组成。有三个keying options:3TDEA(所有三个密钥都不相同),2TDEA(两个密钥不同且K1 = K3),以及第三个情况,即所有密钥都相同,从而给出与DES相同的密文。第一把钥匙
01010101010101010101010101010101
对应于第三个选项(所有键都相同)
ADADADADADAD0101ADADADADADAD0202
对应于第二个选项(2TDEA)。由于CryptoJS要求3DES使用24字节密钥,因此密钥
010101010101010101010101010101010101010101010101
和
ADADADADADAD0101ADADADADADAD0202ADADADADADAD0101
必须使用。
由于明文和密文的长度相同,因此填充不能为
Pkcs7
。可以使用Pkcs7
代替ZeroPadding
,或者如果明文始终是块大小的整数倍(对于3DES为8字节),则使用NoPadding
。如果填充被更改,则可以返回整个密文(而不是子字符串)。