修补pyDes操作模式

时间:2015-11-10 03:54:10

标签: python encryption des ctr-mode

因此,在pyDes,DES的加密库中,有一个API,就像这样pyDes.des(key, [mode], [IV], [pad], [padmode])。它的用法就像这样k = des("DESCRYPT", CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5) - 我可以使用CBC或ECB加密模式。但是,作为我教授的作业,我被告知使用pyDes库加密,但手动使用CBC和计数器模式。

我设法做CBC模式很好,不幸的是我坚持使用计数器模式。 使用给定的des(key, CBC, IV ...) api,我只能在使用CBC或ECB操作模式时使用IV。我不能使用类似des("hello", mode = None, "foo",....)的地方" foo"是我的IV。(我应该实现Counter操作模式,iv在每次迭代中都是随机的) 所以,我的问题是任何人都遇到过这个问题,并试图克服它。

1 个答案:

答案 0 :(得分:1)

为了实现某种模式,您需要隔离的主要操作是没有操作模式或填充的实际块密码。 pyDes似乎没有直接提供对分组密码的直接访问,但您可以使用ECB模式轻松地模拟它。 ECB以相同的方式在所有输入块上简单地执行块密码。

想法是创建计数器输入流,在输入流上执行ECB以获取密钥流,然后使用密钥流中的相应字节对明文的每个字节进行异或。

never try to invalidate the timer in the dealloc method的步骤:

  1. 生成01<<64范围内的随机现时(IV)(DES块大小),这是起始计数器:

    import random
    r = random.SystemRandom()
    nonce = r.randrange(0, 1<<64)
    
  2. 将明文的每个块的计数器转换为CTR mode的字节,并将计数器增加一个

  3. 重复,直到计数器流中的字节数至少与明文
  4. 一样多
  5. 使用ECB模式和任何可用的填充
  6. 加密计数器输入流
  7. 对密钥流和明文进行异或,然后丢弃密钥流的其余部分(如果有的话)
  8. 由于CTR模式是流密码,因此您可以使用完全相同的操作进行解密,唯一的区别是必须从外部提供随机数。您可以将nonce添加到密文,以便它可以用于解密。它不必是秘密的,但如果使用相同的密钥则需要是唯一的。

    请注意,DES和3DES的块大小不允许在同一密钥下使用CTR加密许多密文或长密文。如果这样做,则需要更改为具有更大块大小的块密码,如AES。