5

PyCrypto を使用して、CBC モード (Python 3.2.3 64 ビットおよび PyCrypto 2.6) で AES を使用してバイナリ ファイルを暗号化しています。次のコードを使用: http://eli.thegreenplace.net/2010/06/25/aes-encryption-of-files-in-python-with-pycrypto/

しかし、次のエラーが発生します: ValueError: IV は 16 バイト長でなければなりません。

コードは次のとおりです。

def encryptFile(key, in_filename, out_filename=None, chunksize=64*1024):
""" Encrypts a file using AES (CBC mode) with the
    given key.

    key:
        The encryption key - a string that must be
        either 16, 24 or 32 bytes long. Longer keys
        are more secure.

    in_file:
        Input file

    out_file:
        If None, a StringIO will be returned.

    chunksize:
        Sets the size of the chunk which the function
        uses to read and encrypt the file. Larger chunk
        sizes can be faster for some files and machines.
        chunksize must be divisible by 16.
"""
if not out_filename:
    out_filename = in_filename + '.enc'

iv = ''.join(chr(random.randint(0, 0xFF)) for i in range(16))
encryptor = AES.new(key, AES.MODE_CBC, iv)
filesize = os.path.getsize(in_filename)

with open(in_filename, 'rb') as infile:
    with open(out_filename, 'wb') as outfile:
        outfile.write(struct.pack('<Q', filesize))
        outfile.write(iv)

        while True:
            chunk = infile.read(chunksize)
            if len(chunk) == 0:
                break
            elif len(chunk) % 16 != 0:
                chunk += ' ' * (16 - len(chunk) % 16)

            outfile.write(encryptor.encrypt(chunk))

検索して実験してみましたが、うまくいかないようです。Python は私にとってかなり新しいものであり、暗号化も同様です。どんな助けでも大歓迎です。前もって感謝します。

4

2 に答える 2

7

PyCrypto APIが言うように、IVはテキスト文字列ではなくバイト文字列でなければなりません

コードはPython2で正常に機能します。これは、同じものであるためです(つまり、strUnicodeテキストを処理しない限り、すべてクラスです)。Python 3では、これらは2つの完全に異なるタイプです:bytesstr

したがって、コードは次のようになります。

iv = bytes([ random.randint(0,0xFF) for i in range(16)] )

ただし、このようなコード(Federicoが指摘しているように暗号的に安全ではないことを除けば)は、Python2では正しく機能しません。次の代替方法はどちらの場合も正常に機能し、安全効率的です。

iv = Random.new().read(16)
于 2012-06-09T08:59:48.257 に答える
2

私は遅すぎると思いますが、simple-cryptは、(1) 問題を解決し、(2) 変更を検出するためのキー拡張と hmac を含む pycrypto のシンプルなラッパーを提供します (AES256 CTR モードを使用します)。

于 2013-02-02T14:00:43.410 に答える