2016-04-25 87 views
-1

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

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 
+0

应该没有hexlify工作。再试一次,看看你是否得到相同的错误信息。 – interjay

+0

删除'binascii.hexlify'为我解决它。 –

+0

nop,它不起作用 – user5594493

回答

3

使用此:

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 
>>> 
+0

非常感谢len()帮助调试问题 – user5594493

+0

IT只接受16的倍数输入? '输入字符串必须是16的倍数' – user5594493

+0

@ user5594493是的,密码的输入长度必须与其分组密码相同。 (AES 128的16字节)。对于较小的输入,你必须用输入数据(也许用'00') – EbraHim

相关问题