下面是详细的Python实现批量文件加密功能的完整实例教程。
简介
加密是信息安全中保护文件的一种常用手段,而批量加密功能能够在一次操作中加密多个文件,提高效率。本教程主要介绍如何使用Python实现批量文件加密功能。
准备工作
在开始编写代码之前,我们需要安装pycryptodome模块,这个模块是python中使用AES对称加密时的一个常用库。使用pip命令即可进行安装:
pip install pycryptodome
实现步骤
- 导入所需模块
在代码最开始的地方,我们需要导入所使用的模块:
from Crypto.Cipher import AES
import os, random, struct
- 设定加密解密密码
在进行加密和解密时,需要用到一个密码。通常情况下,我们需要将这个密码设定为一个固定的字符串,避免在使用时出错。
password = 'your_password'
- 生成加密解密密钥
通过密码和一个随机数生成一个密钥。在加密和解密时,要使用相同的密钥。
def generate_key(password):
salt = os.urandom(8)
key = password.encode() + salt
for i in range(65536):
key = hashlib.sha256(key).digest()
return key
- 设定加解密模式
需要设定加密和解密的模式。常用的加解密模式有:
- ECB模式:简单、快速,但能容易受到重复攻击。
- CBC模式:相较于ECB模式,安全性更高,适于加密数据块大小不等的消息。
mode = AES.MODE_CBC
- 设定加解密操作
将读取到的文件分块加密或解密。
def encrypt_file(key, in_filename, out_filename=None, chunksize=64*1024):
if not out_filename:
out_filename = in_filename + '.enc'
iv = os.urandom(16)
encryptor = AES.new(key, mode, 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 += b' ' * (16 - len(chunk) % 16)
outfile.write(encryptor.encrypt(chunk))
def decrypt_file(key, in_filename, out_filename=None, chunksize=24*1024):
if not out_filename:
out_filename = os.path.splitext(in_filename)[0]
with open(in_filename, 'rb') as infile:
filesize = struct.unpack('<Q', infile.read(struct.calcsize('Q')))[0]
iv = infile.read(16)
decryptor = AES.new(key, mode, iv)
with open(out_filename, 'wb') as outfile:
while True:
chunk = infile.read(chunksize)
if len(chunk) == 0:
break
outfile.write(decryptor.decrypt(chunk))
outfile.truncate(filesize)
- 实现批量加密功能
对指定的路径下所有文件逐一加密,并将加密后的文件存储到指定的目录中。
def encrypt_all_files_in_dir(password, root_path, output_path):
key = generate_key(password)
for root, dirs, filenames in os.walk(root_path):
for filename in filenames:
input_file_path = os.path.join(root, filename)
encrypt_file(key, input_file_path, os.path.join(output_path, filename + '.enc'))
- 实现批量解密功能
对指定的路径下所有已加密的文件逐一解密,并将解密后的文件存储到指定的目录中。
def decrypt_all_files_in_dir(password, root_path, output_path):
key = generate_key(password)
for root, dirs, filenames in os.walk(root_path):
for filename in filenames:
if filename.endswith('.enc'):
input_file_path = os.path.join(root, filename)
output_file_path = os.path.join(output_path, os.path.splitext(filename)[0])
decrypt_file(key, input_file_path, output_file_path)
示例说明
下面我们通过两个示例来说明如何使用以上代码。
示例1:批量加密
假设文件夹C:\Users\Documents\photos
中有多个照片文件,我们想要对所有文件进行加密并存储到C:\Users\Documents\encrypted_photos
目录下。
encrypt_all_files_in_dir('password', 'C:/Users/Documents/photos', 'C:/Users/Documents/encrypted_photos')
执行上面的代码之后,就能够完成所有文件的批量加密操作了。
示例2:批量解密
假设文件夹C:\Users\Documents\encrypted_photos
中有多个加密后的照片文件,我们想要对所有文件进行解密并存储到C:\Users\Documents/decrypted_photos
目录下。
decrypt_all_files_in_dir('password', 'C:/Users/Documents/encrypted_photos', 'C:/Users/Documents/decrypted_photos')
执行上面的代码之后,就能够完成所有文件的批量解密操作了。
至此,一个完整的Python实现批量文件加密功能的教程就完成了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 实现批量文件加密功能 - Python技术站