如何在pycrypto中使用AES的CFB模式
How to use CFB mode of AES in 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 和密钥长度,还是我错了?
AES 指定用于 128、192 和 256 位的密钥大小以及 128 位的块大小。至少 CBC 和 CFB 模式的 IV 大小应该等于块大小。除此之外的一切都不是规范的一部分,因此不能与其他实现互操作。
您需要使用足够长的密钥和IV。如果您想使用密码而不是密钥,请使用散列来派生密码。密码的熵通常比随机密钥低得多,因此您需要强大(意味着慢)的密钥派生函数,将给定密码转换为密钥。这将使攻击者很难以高速率暴力破解密码。一个好的密钥派生函数是 PBKDF2,它是 PyCrypto 的provided。默认参数没问题,但您可能希望将迭代次数增加到 10,000。
IV 应该在加密过程中随机生成,但不必保密。通常在发送之前将 IV 附加到密文。由于IV的大小是已知的,因此在解密过程中可以很容易地切掉并使用。
我的问题是如何在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 和密钥长度,还是我错了?
AES 指定用于 128、192 和 256 位的密钥大小以及 128 位的块大小。至少 CBC 和 CFB 模式的 IV 大小应该等于块大小。除此之外的一切都不是规范的一部分,因此不能与其他实现互操作。
您需要使用足够长的密钥和IV。如果您想使用密码而不是密钥,请使用散列来派生密码。密码的熵通常比随机密钥低得多,因此您需要强大(意味着慢)的密钥派生函数,将给定密码转换为密钥。这将使攻击者很难以高速率暴力破解密码。一个好的密钥派生函数是 PBKDF2,它是 PyCrypto 的provided。默认参数没问题,但您可能希望将迭代次数增加到 10,000。
IV 应该在加密过程中随机生成,但不必保密。通常在发送之前将 IV 附加到密文。由于IV的大小是已知的,因此在解密过程中可以很容易地切掉并使用。