3

我正在使用 pyDes 加密一些数据。我想证明,即使您更改密钥或初始值中的一位,加密的数据也会完全不同。我设置了 16 字节密钥以将最后一个字符更改 +/- 1,从而导致至少一位不同。但是,即使我这样做了,3 个不同的加密数据实例也并非完全不同。

from pyDes import *

data = 'Hello'

# CBC : Cipher-Block-Chaining
# \0..\1: arbitrary initial value for CBC
# pad=None: let pyDes take care of padding bytes
k1 = triple_des("16-byte-key-here", CBC, "\0\0\0\0\0\0\0\1", pad=None, padmode=PAD_PKCS5)
k2 = triple_des("16-byte-key-herf", CBC, "\0\0\0\0\0\0\0\1", pad=None, padmode=PAD_PKCS5)
k3 = triple_des("16-byte-key-herd", CBC, "\0\0\0\0\0\0\0\1", pad=None, padmode=PAD_PKCS5)

d1 = k1.encrypt(data)
d2 = k2.encrypt(data)
d3 = k3.encrypt(data)

assert d1 != d2
assert d2 != d3
assert d1 != d3

如果我只对键或初始值进行小的更改,其中一个断言似乎会失败;我已经看到了两者d1 != d2并且d1 != d3失败取决于我改变什么。我还尝试更改'Hello''Hello' * 50确保不仅仅是输入数据太短的情况。

如果我制作完全随机的键,则断言通过。使用如上所示的程序,d1 != d3失败(这些键相距一位;k1-k2 相差 2 位)。

我绝不是加密专家,但如果两个密钥仅相隔一位就产生相同的加密数据,那么这意味着暴力破解密钥所需的努力只是减少了两倍,对吧?

我错过了一些明显的东西吗?Triple DES 是否不应该为非常相似的密钥提供唯一的结果?或者这是 PyDes 中的一个错误?也许其他人可以在另一个实现中确认这种行为?


@Chris Jester-Young 的答案是密钥中的某些位是奇偶校验位。事实证明,根据这篇文章

请注意,虽然 DES 的输入密钥长度为 64 位,但 DES 使用的实际密钥长度仅为 56 位。每个字节中的最低有效(最右边)位是奇偶校验位,应设置为每个字节中始终有奇数个 1。这些奇偶校验位被忽略,因此仅使用每个字节的七个最高有效位,导致密钥长度为 56 位。这意味着三重 DES 的有效密钥强度实际上是 168 位,因为三个密钥中的每一个都包含 8 个在加密过程中不使用的奇偶校验位。

(重点是我的)

这些奇偶校验位正是我在示例中更改的位。

谢谢克里斯!

4

1 回答 1

4

在 DES 中,密钥的某些位是奇偶校验位,实际上并不影响加密/解密。

于 2009-08-16T14:33:39.493 回答