如何在Python 2中加密多个文件

问题描述 投票:-1回答:1

我一直在创建一个数据保护程序,使用SHA-256加密计算机上的所有文件。到目前为止,该程序能够一次加密一个指定文件(已经硬编码到程序中)并附加.enc扩展名。这里唯一的问题是程序在加密后创建一个新文件而不是保存原始文件。因此,如果我加密mypass.txt,我现在将拥有mypass.txt以及mypass.enc,但我需要它将mypass.txt转换为mypass.enc。此外,如果有人知道如何加密所有文件而不是硬编码的文件,我将非常感激。非常感谢任何有任何意见的人,如果您需要任何其他信息,请告诉我。

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

def encrypt_file(key, in_filename, out_filename=None, chunksize=64*1024):

    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 encryption hash cryptography pycrypto
1个回答
0
投票

我假设您要尽可能删除原始文件的内容。创建加密文件后,您可以用0字节覆盖原始文件,并将其删除。

注意:这适用于HDD。当为了磨损均衡而覆盖文件时,SSD驱动器可以并且将使用不同的存储器块。因此,使用0字节覆盖在SSD上无用。对于SSD,您应该确保启用了TRIM。 (如何完成取决于所使用的操作系统和文件系统。)问题是只有SSD的控制器才能确定何时重新使用内存块,从而删除旧内容。所以在SSD上你无法确定文件内容是否已经消失。

由于上述原因,我认为将加密文件系统用于机密数据更好,而不是加密单个文件。这样,写入物理设备的所有内容都会被加密。

至于删除多个文件,您有几个选项。

  1. 在命令行上提供要加密的文件的名称。这可以在您的脚本中以sys.args[1:]检索。
  2. 使用os.walk以递归方式检索当前工作目录下所有文件的路径并加密它们。
  3. 两者的结合。如果sys.args[1:]中的路径是文件(使用os.path.isfile测试),请加密它。如果它是一个目录(使用os.path.isdir测试),请使用os.walk查找该目录中的所有文件并加密它们。
© www.soinside.com 2019 - 2024. All rights reserved.