JavaScript加密功能中的3DES十六进制密钥

时间:2019-06-24 18:21:26

标签: javascript jquery cryptography 3des

我有一个使用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。

能否请您帮助我理解为什么只有第一个键才能正常使用该功能?

1 个答案:

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