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
代码中有两个原因导致结果不同:
指定为十六进制字符串的密钥不会转换为其二进制表示形式。
使用了错误的密钥大小: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个字节的密钥。但是可以使用123412341234ABCD123412341234ABCD
或123412341234ABCD123412341234ABCD123412341234ABCD
键来强制执行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模式不安全。