我正在使用 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 个在加密过程中不使用的奇偶校验位。
(重点是我的)
这些奇偶校验位正是我在示例中更改的位。
谢谢克里斯!