我有一个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。如果填充被更改,则可以返回整个密文(而不是子字符串)。

07-24 19:03