Encryption 为什么更改三重DES密钥或初始值中的一位不会给出不同的加密数据?

Encryption 为什么更改三重DES密钥或初始值中的一位不会给出不同的加密数据?,encryption,3des,symmetric-key,Encryption,3des,Symmetric Key,我正在使用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 c

我正在使用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相差两位)

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

我错过了什么明显的东西吗?三重DES不应该为非常相似的键提供唯一的结果吗?或者这是PyDes中的一个bug?也许其他人可以在另一个实现中确认此行为


@克里斯·杰斯特·杨(Chris Jester Young)的答案是键中的一些位是奇偶校验位。事实证明,根据:

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

(重点是我的)

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


谢谢你,克里斯

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