Python TripleDES(3DES)十六进制输入加密

问题描述 投票:0回答:1

Python 3DES无法输出正确的答案。

    import pyDes
    import binascii

    text = '111122223333AAAA44446666BBBBEEEE'
    binaryText = binascii.unhexlify(text)

    key = '123412341234ABCD'

    k = pyDes.triple_des(key, pyDes.ECB)

    encrypted = k.encrypt(binaryText)

    print("Encrypted Value = %r" % binascii.hexlify(encrypted))

    # decrypted = k.decrypt(encrypted)
    # print("Decrypted Value = %r" %binascii.hexlify(decrypted))

加密值应为:569F2551E1749FEE9221B20C4F76CD4B

3DES在线工具:http://tripledes.online-domain-tools.com/

python encryption des 3des tripledes
1个回答
0
投票

代码中有两个原因导致结果不同:

  • 指定为十六进制字符串的密钥不会转换为其二进制表示形式。

  • 使用了错误的密钥大小:TDES基于DES,并使用3个DES密钥K1,K2,K3。它执行三个DES循环:在第一轮中,执行K1加密,在第二轮中,执行K2解密,最后在第三轮中,再次执行K3加密。支持三个keying options:3TDEA是最强大的变体,并使用三个独立的DES密钥。 2TDEA使用K3 = K1的两个独立密钥。 1TDEA使用三个相同的密钥,其中K3 = K2 = K1,因此将其简化为DES,并且由于DES的安全性,它是最不安全的变体。在Web Site上,键123412341234ABCD的使用表示1TDEA。另一方面,pyDes显式仅支持2TDEA和3TDEA,但不支持1TDEA,因为只允许使用16个字节和24个字节的密钥。但是可以使用123412341234ABCD123412341234ABCD123412341234ABCD123412341234ABCD123412341234ABCD键来强制执行1TDEA。

    以便Python代码提供网站的结果

    key = '123412341234ABCD'
    

    必须替换为

    #key = '123412341234ABCD'                                   # 8 bytes key works for DES, but fails for TDES
    #key = '123412341234ABCD123412341234ABCD'                   # 16 bytes key or               
    key = '123412341234ABCD123412341234ABCD123412341234ABCD'    # 24 bytes key works for TDES
    key = binascii.unhexlify(str.encode(key, 'Utf-8'))          # convert hexadecimal string to binary data
    
  • 请注意,代码在多种方面是不安全的:首先,1TDEA实际上具有DES的优势,因此是不安全的。即使将TDES与3TDEA变量一起使用(安全性可与AES相比),也应使用性能更高的AES。另外,ECB模式不安全。

© www.soinside.com 2019 - 2024. All rights reserved.