因此,在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在每次迭代中都是随机的)
所以,我的问题是任何人都遇到过这个问题,并试图克服它。
答案 0 :(得分:1)
为了实现某种模式,您需要隔离的主要操作是没有操作模式或填充的实际块密码。 pyDes似乎没有直接提供对分组密码的直接访问,但您可以使用ECB模式轻松地模拟它。 ECB以相同的方式在所有输入块上简单地执行块密码。
想法是创建计数器输入流,在输入流上执行ECB以获取密钥流,然后使用密钥流中的相应字节对明文的每个字节进行异或。
never try to invalidate the timer in the dealloc method的步骤:
生成0
到1<<64
范围内的随机现时(IV)(DES块大小),这是起始计数器:
import random
r = random.SystemRandom()
nonce = r.randrange(0, 1<<64)
将明文的每个块的计数器转换为CTR mode的字节,并将计数器增加一个
由于CTR模式是流密码,因此您可以使用完全相同的操作进行解密,唯一的区别是必须从外部提供随机数。您可以将nonce添加到密文,以便它可以用于解密。它不必是秘密的,但如果使用相同的密钥则需要是唯一的。
请注意,DES和3DES的块大小不允许在同一密钥下使用CTR加密许多密文或长密文。如果这样做,则需要更改为具有更大块大小的块密码,如AES。