Python2中如何加密多个文件
How to encrypt multiple files in Python 2
我一直在创建一个数据保护程序,它使用 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))
我假设您想尽可能地删除原始文件的内容。
创建加密文件后,可以用0字节覆盖原文件,然后删除。
注意:这是针对硬盘的。出于磨损均衡的目的,SSD 驱动器在覆盖文件时可以并且将会使用不同的内存块。因此用 0 字节覆盖在 SSD 上没有用。对于 SSD,您应该确保 TRIM 已启用。 (如何完成取决于 OS 和使用的文件系统。)问题是只有 SSD 的控制器决定何时重新使用内存块,抹杀旧内容。所以在 SSD 上你不能真正确定文件内容已经消失。
出于上述原因,我认为对机密数据使用加密文件系统比加密单个文件更好。这样,写入物理设备的所有内容都会被加密。
至于删除多个文件,您有多种选择。
- 在命令行给出要加密的文件名。这可以在您的脚本中检索为
sys.args[1:]
.
- 使用
os.walk
递归获取当前工作目录下所有文件的路径并加密
- 两者的结合。如果
sys.args[1:]
中的路径是一个文件(用 os.path.isfile
测试),加密它。如果是目录(用os.path.isdir
测试),用os.walk
找到那个目录下的所有文件并加密。
我一直在创建一个数据保护程序,它使用 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))
我假设您想尽可能地删除原始文件的内容。 创建加密文件后,可以用0字节覆盖原文件,然后删除。
注意:这是针对硬盘的。出于磨损均衡的目的,SSD 驱动器在覆盖文件时可以并且将会使用不同的内存块。因此用 0 字节覆盖在 SSD 上没有用。对于 SSD,您应该确保 TRIM 已启用。 (如何完成取决于 OS 和使用的文件系统。)问题是只有 SSD 的控制器决定何时重新使用内存块,抹杀旧内容。所以在 SSD 上你不能真正确定文件内容已经消失。
出于上述原因,我认为对机密数据使用加密文件系统比加密单个文件更好。这样,写入物理设备的所有内容都会被加密。
至于删除多个文件,您有多种选择。
- 在命令行给出要加密的文件名。这可以在您的脚本中检索为
sys.args[1:]
. - 使用
os.walk
递归获取当前工作目录下所有文件的路径并加密 - 两者的结合。如果
sys.args[1:]
中的路径是一个文件(用os.path.isfile
测试),加密它。如果是目录(用os.path.isdir
测试),用os.walk
找到那个目录下的所有文件并加密。