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