我正在使用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位)。
我决不是加密专家,但是如果两个密钥只有一个比特的距离,就产生了相同的加密数据,那么这就意味着暴力破解密钥所需的努力只下降了两倍,对吧?
我是否遗漏了一些明显的东西?三重DES不应该为非常相似的键提供唯一的结果吗?或者这是Pydes的一个bug?也许其他人可以在另一个实现中确认这种行为?
@克里斯·杰斯特·杨的答案是,密钥中的一些位是对等位。事实证明,根据
this article
:
请注意,尽管des的输入密钥的长度为64位,但des使用的实际密钥的长度仅为56位。每个字节中的最低有效(最右)位是一个奇偶校验位,并且应该设置为每个字节中总是有1的奇数。这些奇偶校验位被忽略,因此只使用每个字节的七个最高有效位,从而导致密钥长度为56位。
这意味着三重DES的有效密钥强度实际上是168位,因为三个密钥中的每一个都包含8个在加密过程中未使用的奇偶校验位。
(重点是我的)
这些奇偶校验位正是我在例子中改变的位。
谢谢克里斯!