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

8 投票
2 回答
2242 浏览
提问于 2025-04-18 03:43

我尝试使用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 个回答

3

这段话很好地说明了为什么你绝对不应该直接用用户提供的密码作为加密的密钥。你应该使用密钥派生函数来生成密钥。

另外,除了学习用途,你也不应该使用DES加密,因为它通常被认为不安全。现在来看,密钥长度太短了,而且已经有一些已知的攻击方法可以降低破解它的难度。

9

DES 密钥的长度只有 56 位,但因为有奇偶校验位,它们被扩展到了 64 位。每个字节的第八位应该被设置,以确保 奇数奇偶校验

很多加密库会忽略这些奇偶校验位,这就意味着同样的 56 位密钥可以用多种方式表示成 64 位的密钥字符串。实际上,有 28 种不同的表示方式,这也解释了你为什么会找到 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

撰写回答