2016-04-25 28 views
-1

AES暗号化のためにpycryptoモジュールを使用しています。そしてドキュメントを使用して、私は以下の関数を書き留めましたが、それはエラーIV must be 16 bytes longですが、16バイト長のIVを使用しています。AES暗号化でIVが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

関連する問題