我正在使用 pyDes 来加密一些数据。我想证明,如果您更改 key 或初始值中的一位,加密的数据将完全不同。我设置了 16 字节的 key 以将最后一个字符更改 +/- 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 != d2d1 != d3 都失败了,这取决于我所做的更改。我还尝试将 'Hello' 更改为 'Hello' * 50 以确保这不仅仅是输入数据太短的情况。

如果我制作完全随机的 key ,断言就会通过。对于如上所示的程序,d1 != d3 失败(这些 key 相距一位;k1-k2 相差 2 位)。

我绝不是加密专家,但如果两个 key 仅相隔一点会导致相同的加密数据,那么这意味着暴力破解 key 所需的努力减少了两倍,对吧?

我错过了一些明显的东西吗? Triple DES 不应该为非常相似的 key 提供唯一结果吗?或者这是 PyDes 中的错误?也许其他人可以在另一个实现中确认这种行为?

@Chris Jester-Young 的答案是 key 中的某些位是奇偶校验位。事实证明,根据 this article :



(重点是我的)

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

谢谢克里斯!

最佳答案

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

关于encryption - 为什么在 Triple DES key 或初始值中更改一位不会给出不同的加密数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1284412/

10-15 00:36
查看更多