面试题答案
一键面试设计思路
- 分块读取:使用固定大小的块来读取大文件,避免一次性将整个文件读入内存。这样可以有效控制内存使用量。
- 逐块加密:对每一块读取的数据进行AES加密处理。
- 逐块写入:将加密后的数据逐块写入到另一个文件中。
关键代码片段
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import os
def encrypt_large_file(input_file_path, output_file_path, key):
# 创建AES加密器
cipher = AES.new(key, AES.MODE_CBC)
with open(input_file_path, 'rb') as infile, open(output_file_path, 'wb') as outfile:
# 写入初始化向量(IV)
outfile.write(cipher.iv)
while True:
# 分块读取文件
chunk = infile.read(1024 * 1024) # 每次读取1MB
if not chunk:
break
# 对数据块进行填充并加密
padded_chunk = pad(chunk, AES.block_size)
encrypted_chunk = cipher.encrypt(padded_chunk)
# 将加密后的数据块写入输出文件
outfile.write(encrypted_chunk)
# 示例使用
key = b'16 byte key1234567' # 16, 24 或 32字节长的密钥
input_file = 'large_file.bin'
output_file = 'encrypted_large_file.bin'
encrypt_large_file(input_file, output_file, key)
上述代码使用pycryptodome
库进行AES加密,以1MB的块大小读取输入文件,加密后写入输出文件。注意需要先安装pycryptodome
库 (pip install pycryptodome
)。