我的问题是如何在pycrypto中使用CFB模式?我的问题是模块不接受任意长度的 IV 和 key 。
>>> from Crypto.Cipher import AES
>>> aes = AES.new('123456', AES.MODE_CFB, '12345678')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/Crypto/Cipher/AES.py", line 94, in new
return AESCipher(key, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/Crypto/Cipher/AES.py", line 59, in __init__
blockalgo.BlockAlgo.__init__(self, _AES, key, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/Crypto/Cipher/blockalgo.py", line 141, in __init__
self._cipher = factory.new(key, *args, **kwargs)
ValueError: IV must be 16 bytes long
下一个:
>>> aes = AES.new('123456', AES.MODE_CFB, '1234567890ABCDEF')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/Crypto/Cipher/AES.py", line 94, in new
return AESCipher(key, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/Crypto/Cipher/AES.py", line 59, in __init__
blockalgo.BlockAlgo.__init__(self, _AES, key, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/Crypto/Cipher/blockalgo.py", line 141, in __init__
self._cipher = factory.new(key, *args, **kwargs)
ValueError: AES key must be either 16, 24, or 32 bytes long
据我了解,CFB 模式应该接受任意 IV 和 key 长度,还是我错了?
最佳答案
AES 指定 key 大小为 128、192 和 256 位以及 block 大小为 128 位。至少 CBC 和 CFB 模式的 IV 大小应等于 block 大小。除此之外的所有内容都不属于规范的一部分,因此不能与其他实现互操作。
您需要使用足够长的 key 和 IV。如果您想使用密码而不是 key ,请使用散列来派生密码。密码的熵通常比随 secret 钥低得多,因此您需要强大(意味着慢)的 key 派生函数,将给定的密码转换为 key 。这将使攻击者很难高速暴力破解密码。 PBKDF2 是一个很好的 key 导出函数,它是 provided由 PyCrypto 提供。默认参数没问题,但您可能希望将迭代次数增加到 10,000。
IV应该在加密过程中随机生成,但不必保密。通常,在发送密文之前,会将 IV 添加到密文前面。由于IV的大小是已知的,因此在解密过程中可以很容易地将其切掉并使用。
关于python - 如何在pycrypto中使用AES的CFB模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29175226/