Python文件加密解密:保护数据安全的实用指南
Python文件加密解密:保护数据安全的实用指南
在数字化时代,数据安全至关重要。无论是个人隐私还是商业机密,对文件进行加密解密是防止未授权访问的有效手段。Python作为一门功能丰富的编程语言,提供了多种库来轻松实现文件加密。本文将带你逐步了解如何使用Python加密和解密文件,涵盖对称加密和非对称加密两种主流方法。
1. 对称加密:快速且高效
对称加密使用相同的密钥进行加密和解密。Python中常用的库是cryptography,它提供了简洁的API。以下是使用AES(高级加密标准)在CBC模式下加密文件的示例。
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
import os
# 生成随机密钥和初始化向量
key = os.urandom(32) # AES-256
iv = os.urandom(16)
# 加密函数
def encrypt_file(input_path, output_path, key, iv):
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
encryptor = cipher.encryptor()
# 填充函数,因为AES需要块大小对齐
def pad(s):
return s + (16 - len(s) % 16) * chr(16 - len(s) % 16)
with open(input_path, 'rb') as f_in:
plaintext = f_in.read()
ct = encryptor.update(pad(plaintext).encode()) + encryptor.finalize()
with open(output_path, 'wb') as f_out:
# 存储iv和密文
f_out.write(iv + ct)
# 解密函数
def decrypt_file(input_path, output_path, key):
with open(input_path, 'rb') as f_in:
data = f_in.read()
iv = data[:16]
ct = data[16:]
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
decryptor = cipher.decryptor()
plaintext = decryptor.update(ct) + decryptor.finalize()
# 去除填充
pad_len = plaintext[-1]
plaintext = plaintext[:-pad_len]
with open(output_path, 'wb') as f_out:
f_out.write(plaintext)
使用时,只需调用上述函数并传入文件路径。
2. 非对称加密:安全的密钥分发
非对称加密使用公钥加密,私钥解密,适合在不安全通道上交换密钥。RSA是常见的算法。以下示例使用cryptography库生成RSA密钥对并加密文件(注意:RSA不适合加密大文件,通常用于加密对称密钥,此处演示小文件加密)。
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes
# 生成私钥
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend()
)
public_key = private_key.public_key()
# 保存公钥和私钥(略)
# 加密函数(仅适用于小数据)
def rsa_encrypt_file(input_path, output_path, public_key):
with open(input_path, 'rb') as f:
plaintext = f.read()
ciphertext = public_key.encrypt(
plaintext,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
with open(output_path, 'wb') as f:
f.write(ciphertext)
# 解密函数
def rsa_decrypt_file(input_path, output_path, private_key):
with open(input_path, 'rb') as f:
ciphertext = f.read()
plaintext = private_key.decrypt(
ciphertext,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
with open(output_path, 'wb') as f:
f.write(plaintext)
3. 最佳实践
- 密钥管理:密钥务必安全存储,可以使用密钥管理服务或环境变量。
- 大文件处理:对于大文件,对称加密更高效,且应分块加密以防止内存溢出。
- 完整性验证:考虑添加HMAC或数字签名来检测篡改。
总结
Python为文件加密解密提供了强大的工具。通过本文的示例,你可以轻松实现文件保护。根据场景选择合适的加密方式:对称加密适用于大部分情况,非对称加密用于密钥交换。务必注意密钥的安全,否则加密形同虚设。