2016-04-25 82 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

相關問題