Encryption 为什么更改三重DES密钥或初始值中的一位不会给出不同的加密数据?
我正在使用pyDes加密一些数据。我想演示一下,如果您更改密钥或初始值中的一位,加密数据将完全不同。我设置了16字节键,将最后一个字符更改+/-1,导致至少一位不同。然而,即使我这样做了,加密数据的3个不同实例也并非完全不同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
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中,密钥的某些位是奇偶校验位,实际上不会影响加密/解密