代码之家  ›  专栏  ›  技术社区  ›  Mark Rushakoff

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

  •  3
  • Mark Rushakoff  · 技术社区  · 15 年前

    我正在使用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位)。

    我决不是加密专家,但是如果两个密钥只有一个比特的距离,就产生了相同的加密数据,那么这就意味着暴力破解密钥所需的努力只下降了两倍,对吧?

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


    @克里斯·杰斯特·杨的答案是,密钥中的一些位是对等位。事实证明,根据 this article :

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

    (重点是我的)

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

    谢谢克里斯!

    1 回复  |  直到 15 年前
        1
  •  4
  •   C. K. Young    15 年前

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