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

标签 python encryption cryptography aes pycrypto

我的问题是如何在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/

相关文章:

python - Python 上美国格式的周数

python - 模块未找到错误: No module named 'camelcase'

authentication - 如何将密码加密到 key 表文件中?

ruby-on-rails - 当在HTTP header 而不是cookie中找到加密值时,如何解密 `.signed`?

encryption - 能够分解大量数字如何决定流行加密算法的安全性?

java - 从 Java 访问 Firefox 的证书信任库

javascript - Django:没有提交按钮的表单导致 404 错误

python - 从数据框或系列的 Pandas 输出中删除名称、数据类型

java - 在 spring-ws (wss4j) 中添加加密/解密的正确方法是什么?

cryptography - Javacard 在 APDU 中发送 RSA 公钥