在Python中加密/解密动画gif,而不将最终副本存储到HD

在Python中加密/解密动画gif,而不将最终副本存储到HD,python,encryption,pycrypto,in-memory,Python,Encryption,Pycrypto,In Memory,好的,让我们再试一次 我正在尝试用PyCrypto加密要发送给某人的动画gif。在接收者得到它之后,他们应该能够运行我的pycrypto脚本并查看动画图像,而无需将未加密的文件存储到硬盘上。本质上,我试图将未加密的文件保存在内存中,以便其他库可以访问它,而无需将其保存到磁盘 我一直在用加密技术 import os, random, struct from Crypto.Cipher import AES def encrypt_file(key='8c57d066796428d5a8f4b01

好的,让我们再试一次

我正在尝试用PyCrypto加密要发送给某人的动画gif。在接收者得到它之后,他们应该能够运行我的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))
导入操作系统,随机,结构
从Crypto.Cipher导入AES
def encrypt_文件(key='8C57D066796428D5A8F4B01255DAD90',in_filename='tile.png',out_filename=None,chunksize=8192):
“”“使用AES(CBC模式)和
给钥匙。
关键:
加密密钥-必须为
16、24或32字节长。更长的键
它们更安全。
在文件名中:
输入文件的名称
输出文件名:
如果没有,将使用“.enc”。
块大小:
设置要使用函数的块的大小
用于读取和加密文件。较大的块
某些文件和计算机的大小可能更快。
chunksize必须可以被16整除。
"""
如果没有输出文件名:
out_filename=in_filename+'.enc'
iv=''.join(范围(16))中i的chr(random.randint(0,0xFF))
加密机=AES.new(密钥,AES.MODE_CBC,iv)
filesize=os.path.getsize(在文件名中)
打开(在文件名“r”中)作为填充:
将open(out_filename,'w')作为输出文件:
outfile.write(struct.pack(“使用而不是名为
out\u 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() 
因此,您需要将
替换为open(out_filename,'w')作为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)) 
以open(in_filename,'r')作为填充:
outfile=StringIO.StringIO()

outfile.write(结构包(':)看起来好多了。谢谢。如果我早些时候被认为是粗鲁无礼的话,我很抱歉。我绞尽脑汁想弄明白这一点,这让我非常恼火。这很好。我们想帮忙,但当你不明确问题是什么时,我们不能。这看起来像我需要的,但StringIO对象是否被完全像文件一样对待例如,如果我使用stringIO存储解密后的gif文件,可以像访问实际图像一样使用PIL访问它吗?是的。你可以使用PILPerfect操作stringIO文件!这正是我想要的-我花了几个小时才发现你们在几分钟内做了什么。一开始就应该这样做。谢谢大家!忘了添加:StringIO对象的警告是,您经常会忘记(因为不记得正确的短语是什么)在
文件
上有一个光标位置。根据您编写文件的方式,您可能需要
obj.seek(0)
重置读取位置。如果不关闭普通文件,则需要在普通文件上执行此操作,但大多数人将打开/写入/关闭打开/读取作为单独的操作。