我有一个使用CryptoJS的javascript函数,可以使用3DES密钥对8bytes的块进行加密。
该功能可以使用键01010101010101010010101010101010101,但不能使用键ADADADADADAD00ADAADADADADADAD0202。
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。
能否请您帮助我理解为什么只有第一个键才能正常使用该功能?
答案 0 :(得分:1)
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
。可以使用ZeroPadding
代替Pkcs7
,或者如果明文始终是块大小的整数倍(对于3DES为8字节),则NoPadding
。如果填充被更改,则可以返回整个密文(而不是子字符串)。