0

因此,在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 模式,不幸的是我被计数器模式卡住了。使用给定的 api 时,des(key, CBC, IV ...)我只能在使用 CBC 或 ECB 操作模式时使用 IV。我不能像des("hello", mode = None, "foo",....)“foo”是我的 IV 那样使用它。(我应该实现 Counter 操作模式,并且 iv 在每次迭代中都是随机的)所以,我的问题是有人遇到过这个问题,并试图克服它。

4

1 回答 1

1

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

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

CTR模式的步骤:

  1. 0生成一个在到(DES 块大小)范围内的随机随机数 (IV),1<<64它是起始计数器:

    import random
    r = random.SystemRandom()
    nonce = r.randrange(0, 1<<64)
    
  2. 将每个明文块的计数器转换为字节,struct.pack('>Q', counter)并将计数器加一

  3. 重复直到计数器流中的字节数至少与明文中的字节数一样多
  4. 使用 ECB 模式和任何可用的填充加密计数器输入流
  5. XOR 密钥流和明文并丢弃其余的密钥流(如果有)

由于 CTR 模式是一种流密码,因此您可以使用完全相同的操作进行解密,唯一的区别是必须从外部提供 nonce。您可以将随机数添加到密文中,以便将其用于解密。它不必是秘密的,但如果使用相同的密钥,它必须是唯一的。

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

于 2015-11-10T09:38:05.920 回答