如何在pycrypto中使用AES的CFB模式

时间:2015-03-20 20:23:21

标签: python encryption cryptography aes pycrypto

我的问题是如何在pycrypto中使用CFB模式?我的问题是模块不接受任意长度的IV和密钥。

>>> 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和密钥长度,或者我错了吗?

1 个答案:

答案 0 :(得分:2)

AES指定密钥大小为128,192和256位以及块大小为128位。至少CBC和CFB模式的IV大小应等于块大小。除此之外的所有内容都不是规范的一部分,因此无法与其他实现互操作。

你需要使用足够长的密钥和IV。如果要使用密码而不是密钥,请使用散列来派生密码。密码通常比随机密钥具有更低的熵,因此您需要强大(意味着慢)密钥派生功能,将给定密码转换为密钥。这将使攻击者很难以高速率强行破解密码。一个好的密钥导出函数是PyKrypto的provided的PBKDF2。默认参数没问题,但您可能希望将迭代次数增加到10,000。

IV应该在加密期间随机生成,但不必保密。通常在发送之前将IV添加到密文之前。由于IV的大小是已知的,因此在解密和使用过程中可以很容易地将其切掉。