自学内容网 自学内容网

python 文件加密与解密

在日常办公和数据处理任务中,确保文件的安全性至关重要。通过加密技术,我们可以有效防止数据在传输或存储过程中被未授权的人获取和修改。本章将介绍如何使用 Python 实现文件加密和解密操作。

1 加密与解密的基础概念

1.1 对称加密

对称加密是一种加密算法,在加密和解密过程中使用相同的密钥。常见的对称加密算法包括 AES(高级加密标准)和 DES(数据加密标准)。对称加密的特点是速度快,适合处理大规模数据,但由于加密和解密使用相同的密钥,密钥管理是一个挑战。

1.2 非对称加密

非对称加密使用一对密钥:公钥和私钥。公钥用于加密,私钥用于解密。非对称加密的代表算法是 RSA。非对称加密虽然安全性较高,但加密速度较慢,通常用于加密小数据块或密钥交换。

2 使用 cryptography 库进行文件加密与解密

cryptography 是 Python 中一个广泛使用的加密库,支持对称和非对称加密。我们将使用该库实现文件的加密和解密。

2.1 安装 cryptography

首先,确保安装了 cryptography 库:

pip install cryptography
2.2 对称加密 (AES)

我们使用 cryptography 库中的 Fernet 模块进行对称加密,Fernet 是基于 AES 算法的对称加密方式,且密钥长度为 128 位。

生成密钥
from cryptography.fernet import Fernet

# 生成密钥
key = Fernet.generate_key()

# 保存密钥到文件
with open('secret.key', 'wb') as key_file:
    key_file.write(key)

print("密钥已生成并保存")
加密文件

使用生成的密钥加密文件:

from cryptography.fernet import Fernet

# 读取密钥
with open('secret.key', 'rb') as key_file:
    key = key_file.read()

# 初始化加密器
cipher = Fernet(key)

# 加密文件
with open('example.txt', 'rb') as file:
    file_data = file.read()

# 加密内容
encrypted_data = cipher.encrypt(file_data)

# 将加密后的内容写入新文件
with open('example_encrypted.txt', 'wb') as encrypted_file:
    encrypted_file.write(encrypted_data)

print("文件已加密")
解密文件

使用同样的密钥解密文件:

# 读取密钥
with open('secret.key', 'rb') as key_file:
    key = key_file.read()

# 初始化解密器
cipher = Fernet(key)

# 读取加密文件
with open('example_encrypted.txt', 'rb') as encrypted_file:
    encrypted_data = encrypted_file.read()

# 解密内容
decrypted_data = cipher.decrypt(encrypted_data)

# 将解密后的内容写入新文件
with open('example_decrypted.txt', 'wb') as decrypted_file:
    decrypted_file.write(decrypted_data)

print("文件已解密")

解释:

  • Fernet.generate_key():生成一个随机的加密密钥。
  • encrypt():使用密钥加密文件内容。
  • decrypt():使用密钥解密加密内容。
2.3 非对称加密 (RSA)

非对称加密中,我们通常使用 RSA 算法,它使用公钥加密、私钥解密。cryptography 库也支持非对称加密。

生成 RSA 密钥对
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization

# 生成私钥
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
)

# 保存私钥
with open('private_key.pem', 'wb') as key_file:
    key_file.write(private_key.private_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PrivateFormat.PKCS8,
        encryption_algorithm=serialization.NoEncryption()
    ))

# 生成公钥
public_key = private_key.public_key()

# 保存公钥
with open('public_key.pem', 'wb') as key_file:
    key_file.write(public_key.public_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PublicFormat.SubjectPublicKeyInfo
    ))

print("RSA 密钥对已生成")
加密文件

使用公钥对文件进行加密:

from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes

# 读取公钥
with open('public_key.pem', 'rb') as key_file:
    public_key = serialization.load_pem_public_key(key_file.read())

# 读取文件数据
with open('example.txt', 'rb') as file:
    file_data = file.read()

# 使用公钥加密文件
encrypted_data = public_key.encrypt(
    file_data,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# 保存加密后的文件
with open('example_encrypted_rsa.txt', 'wb') as encrypted_file:
    encrypted_file.write(encrypted_data)

print("文件已使用公钥加密")
解密文件

使用私钥解密文件:

# 读取私钥
with open('private_key.pem', 'rb') as key_file:
    private_key = serialization.load_pem_private_key(key_file.read(), password=None)

# 读取加密文件数据
with open('example_encrypted_rsa.txt', 'rb') as encrypted_file:
    encrypted_data = encrypted_file.read()

# 使用私钥解密文件
decrypted_data = private_key.decrypt(
    encrypted_data,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# 保存解密后的文件
with open('example_decrypted_rsa.txt', 'wb') as decrypted_file:
    decrypted_file.write(decrypted_data)

print("文件已使用私钥解密")

3 使用 PyCryptodome 库进行文件加密与解密

除了 cryptographyPyCryptodome 也是一个常用的加密库,它提供了更加底层的加密算法实现。以下是使用 PyCryptodome 进行 AES 加密和解密的示例。

3.1 安装 PyCryptodome
pip install pycryptodome
3.2 使用 AES 加密文件
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

# 生成密钥和初始化向量 (IV)
key = get_random_bytes(16)
iv = get_random_bytes(16)

# 创建 AES 加密器
cipher = AES.new(key, AES.MODE_CFB, iv)

# 读取要加密的文件
with open('example.txt', 'rb') as file:
    file_data = file.read()

# 加密数据
encrypted_data = iv + cipher.encrypt(file_data)

# 保存加密后的文件
with open('example_encrypted_aes.bin', 'wb') as encrypted_file:
    encrypted_file.write(encrypted_data)

print("文件已使用 AES 加密")
3.3 使用 AES 解密文件
# 读取加密文件
with open('example_encrypted_aes.bin', 'rb') as encrypted_file:
    encrypted_data = encrypted_file.read()

# 提取 IV 和加密内容
iv = encrypted_data[:16]
ciphertext = encrypted_data[16:]

# 创建 AES 解密器
cipher = AES.new(key, AES.MODE_CFB, iv)

# 解密数据
decrypted_data = cipher.decrypt(ciphertext)

# 保存解密后的文件
with open('example_decrypted_aes.txt', 'wb') as decrypted_file:
    decrypted_file.write(decrypted_data)

print("文件已使用 AES 解密")

4 加密与解密的最佳实践

  • 安全存储密钥:密钥是加密与解密的核心,务必妥善存储密钥,避免被未授权的用户获取。
  • 使用强密码:如果使用对称加密,建议选择强密码并定期更新密钥。
  • **

加密敏感数据**:特别是在传输或存储敏感数据时,始终使用加密技术保护文件的完整性和机密性。



原文地址:https://blog.csdn.net/imdeity/article/details/142454795

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!