我正在使用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得到的答案是密钥中的一些位是奇偶校验位。事实证明,根据this article:
请注意,尽管DES的输入密钥长度为64位,但DES使用的实际密钥长度仅为56位。每个字节中的最低有效位(最右侧)是奇偶校验位,应设置为每个字节始终有奇数个1。忽略这些奇偶校验位,因此仅使用每个字节的七个最高有效位,导致密钥长度为56位。 这意味着Triple DES的有效密钥强度实际上是168位,因为三个密钥中的每一个都包含8个在加密过程中未使用的奇偶校验位。
(重点是我的)
那些奇偶校验位正是我在示例中改变的位。
谢谢Chris!
答案 0 :(得分:4)
在DES中,密钥的某些位是奇偶校验位,实际上并不影响加密/解密。