Javascript 加密函数中的 3DES 十六进制密钥
3DES Hexadecimal key in a Javascript encryption function
我有一个 javascript 函数,它使用 CryptoJS 使用 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 加密的块 040502CFFFFEFFDEE 是 C9478CAA27ABA56A,这个输出是正确的。
但是用密钥ADADADADADAD0101ADADADADADAD0202加密的块040502CFFFFEFFDEE是A413ABD86D52DFFB,这个输出是错误的,正确的应该是F6A1C5ACA15A50C3。
你能帮我理解为什么这个功能只适用于第一个键吗?
3DES (or TripleDES) is not DES。因此 CryptoJS.DES
必须替换为 CryptoJS.TripleDES
.
3DES 密钥由 3 个串联的 DES 密钥(K1、K2、K3)组成。有三种keying options:3TDEA(所有三个密钥都不同)、2TDEA(2 个密钥不同且K1 = K3)和第三种所有密钥都相同的情况,它给出与DES 相同的密文。第一个键
01010101010101010101010101010101
对应第三个选项(所有键相同),键
ADADADADADAD0101ADADADADADAD0202
对应第二个选项(2TDEA)。由于 CryptoJS 期望 3DES 有一个 24 字节的密钥,密钥
010101010101010101010101010101010101010101010101
和
ADADADADADAD0101ADADADADADAD0202ADADADADADAD0101
必须使用。
由于明文和密文长度相同,不能使用padding Pkcs7
. Instead of Pkcs7
, ZeroPadding
,或者如果明文总是blocksize的整数倍(8 Byte for 3DES), NoPadding
。如果更改填充,则可以返回整个密文(而不是子字符串)。
我有一个 javascript 函数,它使用 CryptoJS 使用 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 加密的块 040502CFFFFEFFDEE 是 C9478CAA27ABA56A,这个输出是正确的。
但是用密钥ADADADADADAD0101ADADADADADAD0202加密的块040502CFFFFEFFDEE是A413ABD86D52DFFB,这个输出是错误的,正确的应该是F6A1C5ACA15A50C3。
你能帮我理解为什么这个功能只适用于第一个键吗?
3DES (or TripleDES) is not DES。因此
CryptoJS.DES
必须替换为CryptoJS.TripleDES
.3DES 密钥由 3 个串联的 DES 密钥(K1、K2、K3)组成。有三种keying options:3TDEA(所有三个密钥都不同)、2TDEA(2 个密钥不同且K1 = K3)和第三种所有密钥都相同的情况,它给出与DES 相同的密文。第一个键
01010101010101010101010101010101
对应第三个选项(所有键相同),键
ADADADADADAD0101ADADADADADAD0202
对应第二个选项(2TDEA)。由于 CryptoJS 期望 3DES 有一个 24 字节的密钥,密钥
010101010101010101010101010101010101010101010101
和
ADADADADADAD0101ADADADADADAD0202ADADADADADAD0101
必须使用。
由于明文和密文长度相同,不能使用padding
Pkcs7
. Instead ofPkcs7
,ZeroPadding
,或者如果明文总是blocksize的整数倍(8 Byte for 3DES),NoPadding
。如果更改填充,则可以返回整个密文(而不是子字符串)。