为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

肥皂起泡泡 2021-07-06 13:22:05
我有一个使用 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。你能帮我理解为什么这个功能只能用第一个键才能正常工作吗?
查看完整描述

1 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

  • 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。取而代之的Pkcs7ZeroPadding可以使用,或者,如果明文总是块大小(8字节为3DES)的整数倍,NoPadding。如果填充更改,则可以返回整个密文(而不是子字符串)。


查看完整回答
反对 回复 2021-07-15
  • 1 回答
  • 0 关注
  • 493 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信