为什么改变一个位在三重DES密钥或初始值没有给出不同的加密数据?(Why does changing one bit in a Triple DES key or initial value not give different encrypted data?)

我使用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 != d2d1 != d3取决于我改失败。 我也试图改变'Hello''Hello' * 50 ,以确保它不只是输入数据太短的情况。

如果我做完全随机密钥,断言通过。 与上面所见的程序, d1 != d3失败(这些键相隔一个比特; K1-K2是不同的2位)。

我决不是一个加密专家,但如果两个键只有一个位相隔导致相同的加密数据,那么这意味着它需要由两个因素来暴力破解的关键只是下楼的功夫,对不对?

我失去了一些东西明显? 三重DES不应该给唯一的结果非常相似的钥匙? 或者,这是PyDes的错误吗? 也许别人可以证实在另一个实施这种行为?


@克里斯小丑,杨得到了答案,一些在关键位是奇偶校验位。 而事实证明,根据这篇文章

注意,虽然对于DES输入键是64位长,通过DES所用的实际密钥,其长度只有56位。 所述至少显著(最右侧)中的每个字节的位是奇偶校验位,并且应被设置,使得总有奇数个在每一个字节中1的。 这些奇偶校验位将被忽略,所以只有七个每个字节的最显著位被用于,导致56位的密钥长度。 这意味着,对于三重DES的有效密钥强度实际上是168个比特,因为每个三个键的包含在加密过程中,不使用8个奇偶校验比特。

(重点是我的)

而这些奇偶校验位都是一模一样我是在例如改变位。

谢谢克里斯!

Answer 1:

在DES,密钥的一些位是奇偶校验位,而实际上并不影响加密/解密。