Зашифруйте / расшифруйте анимированный GIF-файл в Python без сохранения окончательной копии в HD

Хорошо, давайте попробуем это снова.

Я пытаюсь зашифровать анимированный 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))

, но это, похоже, ничего не делает. Я даже не знаю, с чего начать расшифровку, потому что мне снова нужно иметь доступ к расшифрованному файлу, не сохраняя его на жестком диске.

Спасибо, парни.

1 ответ

Решение

Как насчет использования 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)) 
Другие вопросы по тегам