首页 > 解决方案 > Javascript 加密函数中的 3DES 十六进制密钥

问题描述

我有一个 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 加密的块 040502CFFFFEFDEE 为 C9478CAA27ABA56A,此输出是正确的。

但是使用密钥 ADADADADADADAD0101ADADADADADAD0202 加密的块 040502CFFFFEFDEE 是 A413ABD86D52DFFB ,这个输出是错误的,正确的应该是 F6A1C5ACA15A50C3。

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

标签: javascriptjquerycryptography3des

解决方案


  • 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,或者如果明文始终是块大小的整数倍(3DES 为 8 字节),则. 如果更改了填充,则可以返回整个密文(而不是子字符串)。ZeroPaddingNoPadding


推荐阅读