【问题标题】:IV must be 16 bytes long error in AES encryptionIV 必须是 16 字节长的 AES 加密错误
【发布时间】:2020-04-28 02:43:02
【问题描述】:

我正在使用pycrypto 模块进行 AES 加密。并且使用文档我已经写下了以下函数,但它总是给出错误IV must be 16 bytes long,但我使用的是 16 字节长的 IV。

def aes_encrypt(plaintext):
    """
    """
    key = **my key comes here**
    iv = binascii.hexlify(os.urandom(16)) # even used without binascii.hexlify)

    aes_mode = AES.MODE_CBC

    obj = AES.new(key, aes_mode, iv)

    ciphertext = obj.encrypt(plaintext)
    return ciphertext

【问题讨论】:

  • 它应该可以在没有 hexlify 的情况下工作。再试一次,看看你是否得到同样的错误信息。
  • 删除 binascii.hexlify 为我修复了它。
  • nop,它不工作
  • 如果它不起作用,您为什么接受刚刚删除hexlify的答案?
  • @interjay 抱歉,但删除 hexlify 后,我错了;y 使用了 32 个字节而不是 16 个字节,所以它抛出了同样的错误

标签: python encryption pycrypto


【解决方案1】:

使用这个:

from Crypto.Cipher import AES 
import binascii,os

def aes_encrypt(plaintext):
    key = "00112233445566778899aabbccddeeff"
    iv = os.urandom(16)
    aes_mode = AES.MODE_CBC
    obj = AES.new(key, aes_mode, iv)
    ciphertext = obj.encrypt(plaintext)
    return ciphertext

工作如下:

>>> aes_encrypt("TestTestTestTest")
'r_\x18\xaa\xac\x9c\xdb\x18n\xc1\xa4\x98\xa6sm\xd3'
>>> 

这就是区别:

>>> iv =  binascii.hexlify(os.urandom(16))
>>> iv
'9eae3db51f96e53f94dff9c699e9e849'
>>> len(iv)
32
>>> iv = os.urandom(16)
>>> iv
'\x16fdw\x9c\xe54]\xc2\x12!\x95\xd7zF\t'
>>> len(iv)
16
>>>

【讨论】:

  • 非常感谢,len() 有助于调试问题
  • IT 只接受 16 的倍数的输入? Input strings must be a multiple of 16 in length
  • @user5594493 是的,密码的输入长度必须与其分组密码相等。 (AES 128 为 16 字节)。对于较小的输入,您必须使用数据填充输入(可能使用00
  • 这个 AES 密文也不是 json 可序列化的,所以有什么办法可以编码这个 CT,然后在解密之前解码,这样我就可以轻松地在我的 AOI 中传递这个 CT
  • @EbraHim 在尝试代码时,我得到了TypeError: Object type <class 'str'> cannot be passed to C code。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 2015-02-05
  • 2019-09-30
  • 2023-03-25
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多