Javascript 加密函数中的 3DES 十六进制密钥

我有一个使用 CryptoJS 的 javascript 函数来使用 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 加密的块 040502CFFFFEFDEE 是 C9478CAA27ABA56A 并且此输出是正确的。


但是同一个块 040502CFFFFEFDEE 用密钥 ADADADADAD0101ADADADADADAD0202 加密的块是 A413ABD86D52DFFB 并且这个输出是错误的,正确的应该是 F6A1C5ACA15A50C3。


你能帮我理解为什么这个功能只能用第一个键才能正常工作吗?


肥皂起泡泡
浏览 498回答 1
1回答

PIPIONE

3DES(或TripleDES)不是DES。因此CryptoJS.DES必须替换为CryptoJS.TripleDES。3DES 密钥由 3 个串联的 DES 密钥(K1、K2、K3)组成。有三种密钥选项:3TDEA(所有三个密钥都不同)、2TDEA(2 个密钥不同且 K1 = K3)以及所有密钥相同的第三种情况,这给出了与 DES 相同的密文。第一个键01010101010101010101010101010101对应第三个选项(所有键相同),键ADADADADADAD0101ADADADADADAD0202对应于第二个选项 (2TDEA)。由于 CryptoJS 需要 3DES 一个 24 字节的密钥,因此密钥010101010101010101010101010101010101010101010101和ADADADADADAD0101ADADADADADAD0202ADADADADADAD0101必须使用。由于明文和密文的长度相同,所以填充不能为Pkcs7。取而代之的Pkcs7,ZeroPadding可以使用,或者,如果明文总是块大小(8字节为3DES)的整数倍,NoPadding。如果填充更改,则可以返回整个密文(而不是子字符串)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript