我尝试使用pyDes和Crypto.Cipher.DES模块实现DES算法。我发现了一个问题,当我用82514145
密钥加密然后使用93505044
解密密码时,我可以检索解密的文本。我发现256个键表现得像这样。这违反了密码学。我的代码如下:
from Crypto.Cipher import DES
plain_text = 'asdfghij'
print 'plain Text: ', plain_text
des = DES.new('82514145', DES.MODE_ECB)
cipher_text = des.encrypt(plain_text)
print 'the cipher text is ', cipher_text
des = DES.new('93505044', DES.MODE_ECB)
print 'the decrypted text is: ', des.decrypt(cipher_text)
输出是:
plain Text: asdfghij
the cipher text is @�Z����
the decrypted text is: asdfghij
我的工作有什么问题吗?我也用pyDes得到了相同的结果。
答案 0 :(得分:8)
DES密钥只有56位长,但由于奇偶校验位,它们扩展到64位。应设置每个字节的第8位以确保odd parity。
许多加密库忽略奇偶校验位,这意味着有很多方法可以在64位密钥字符串中表示相同的56位密钥。事实上,有2种 8 不同的方式,这就解释了为什么你找到256个匹配的密钥。
您的示例包含两个仅在奇偶校验位上有所不同的键值。见下文 - 奇偶校验位位于[]
:
82514145
= 0x3832353134313435
= 0011100[0] 0011001[0] 0011010[1] 0011000[1] 0011010[0] 0011000[1] 0011010[0] 0000000[0]
93505044
= 0x3933353035303434
= 0011100[1] 0011001[1] 0011010[1] 0011000[0] 0011010[1] 0011000[0] 0011010[0] 0000000[0]
这两个密钥实际上都不是真正有效的。该密钥的正确表示形式为:0x3832343134313401
。
答案 1 :(得分:2)
这是you should never use a user provided password as a key itself in a key in a cipher原因的一个很好的例子。您应该使用key derivation function代替。
此外,您不应将DES用于教育以外的目的,因为它通常被认为是不安全的。现在关键被认为太短了,并且有一些已知的攻击可以降低其复杂性。