为什么我可以使用一个DES密钥加密数据并成功解密另一个DES密钥?

时间:2014-04-22 09:53:57

标签: python cryptography des encryption-symmetric pycrypto

我尝试使用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得到了相同的结果。

2 个答案:

答案 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用于教育以外的目的,因为它通常被认为是不安全的。现在关键被认为太短了,并且有一些已知的攻击可以降低其复杂性。