3

さて、これをもう一度試してみましょう。

アニメーションGIFをPyCryptoで暗号化して、誰かに送信しようとしています。受信者がそれを取得すると、暗号化されていないファイルをハードドライブに保存せずに、私のpycryptoスクリプトを実行してアニメーション画像を表示できるようになります。基本的に、暗号化されていないファイルをメモリに保存して、ディスクに保存せずに別のライブラリからアクセスできるようにしようとしています。

私が使用している暗号化には

import os, random, struct
from Crypto.Cipher import AES

def encrypt_file(key='8c57d066796428d5a8f4b012155dad90', in_filename='tile.png', out_filename=None, chunksize=8192):
    """ 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_filename:
            Name of the input file

        out_filename:
            If None, '<in_filename>.enc' will be used.

        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, 'r') as infile:
        with open(out_filename, 'w') 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))

、しかしそれは何もしていないようです。復号化されたファイルをハードドライブに保存せずにアクセスできるようにする必要があるため、復号化部分のどこから始めればよいのかさえわかりません。

みんなありがとう。

4

1 に答える 1

3

と呼ばれる実際のディスクファイルの代わりにStringIOを使用するのはどうout_filenameですか?

同じ構造の仮想ディスクを使用するだけです。

例:

import StringIO

f=StringIO.StringIO()

for line in ['line {}\n'.format(i) for i in range(25)]:
    f.write(line)

f.seek(0)

for line in f:
    print line.strip() 

with open(out_filename, 'w') as outfile: ...したがって、への呼び出しに置き換える必要がoutfile=StringIO.StringIO()あり、残りは同じである必要があります。

そのようです:

with open(in_filename, 'r') as infile:
    outfile=StringIO.StringIO()
    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)) 
于 2013-03-25T19:52:33.653 に答える