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

时间:2018-01-02 03:16:44

标签: python encryption hash cryptography pycrypto

我一直在创建一个数据保护程序,使用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))

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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