Python文件加密库之cryptography使用详解


概要

在现代信息社会中,数据的安全性变得越来越重要。为了保护敏感信息,文件加密技术被广泛应用。Python的cryptography库提供了强大的加密功能,可以轻松实现文件加密和解密。本文将详细介绍如何使用cryptography库进行文件加密,包含具体的示例代码。


cryptography库简介

cryptography是Python中一个功能强大且易用的加密库,提供了对称加密、非对称加密、哈希算法、数字签名等多种加密功能。本文主要介绍对称加密,即使用相同的密钥进行加密和解密操作。

安装cryptography库

可以使用pip命令安装cryptography库:

pip install cryptography

使用对称加密加密文件

对称加密是一种使用相同密钥进行加密和解密的技术。cryptography库中的Fernet类提供了对称加密的实现。

生成密钥

首先,需要生成一个密钥,用于加密和解密文件。

from cryptography.fernet import Fernet

# 生成密钥
key = Fernet.generate_key()
print("密钥:", key.decode())

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

加密文件

使用生成的密钥对文件进行加密。

from cryptography.fernet import Fernet

# 从文件中加载密钥
with open('secret.key', 'rb') as key_file:
    key = key_file.read()

# 创建Fernet对象
cipher = Fernet(key)

# 读取文件内容
with open('plaintext.txt', 'rb') as file:
    file_data = file.read()

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

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

print("文件加密成功")

解密文件

使用相同的密钥对加密的文件进行解密。

from cryptography.fernet import Fernet

# 从文件中加载密钥
with open('secret.key', 'rb') as key_file:
    key = key_file.read()

# 创建Fernet对象
cipher = Fernet(key)

# 读取加密文件内容
with open('encrypted.txt', 'rb') as file:
    encrypted_data = file.read()

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

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

print("文件解密成功")

实际案例:加密和解密一个文本文件

示例文件内容

创建一个名为plaintext.txt的文本文件,内容如下:

这是一个需要加密的文本文件。

完整的加密和解密脚本

生成密钥并保存

from cryptography.fernet import Fernet

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

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

print("密钥已生成并保存到secret.key文件")

加密文件

from cryptography.fernet import Fernet

# 从文件中加载密钥
with open('secret.key', 'rb') as key_file:
    key = key_file.read()

# 创建Fernet对象
cipher = Fernet(key)

# 读取文件内容
with open('plaintext.txt', 'rb') as file:
    file_data = file.read()

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

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

print("文件已加密并保存到encrypted.txt文件")

解密文件

from cryptography.fernet import Fernet

# 从文件中加载密钥
with open('secret.key', 'rb') as key_file:
    key = key_file.read()

# 创建Fernet对象
cipher = Fernet(key)

# 读取加密文件内容
with open('encrypted.txt', 'rb') as file:
    encrypted_data = file.read()

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

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

print("文件已解密并保存到decrypted.txt文件")

处理错误和异常

在实际应用中,需要处理可能出现的错误和异常情况,例如密钥文件丢失、加密文件损坏等。

示例:处理异常

from cryptography.fernet import Fernet, InvalidToken

try:
    # 从文件中加载密钥
    with open('secret.key', 'rb') as key_file:
        key = key_file.read()

    # 创建Fernet对象
    cipher = Fernet(key)

    # 读取加密文件内容
    with open('encrypted.txt', 'rb') as file:
        encrypted_data = file.read()

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

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

    print("文件解密成功")
except FileNotFoundError:
    print("密钥文件或加密文件未找到")
except InvalidToken:
    print("解密失败,密钥可能不正确或文件已损坏")

使用密码生成密钥

在某些场景下,可能不方便保存密钥文件,可以使用密码生成密钥。这需要使用cryptography库中的PBKDF2HMAC方法。

示例:使用密码生成密钥

from cryptography.fernet import Fernet
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.backends import default_backend
import base64

password = b"my_secure_password"  # 密码必须是字节类型
salt = b'\x9c\x1b\xcf\xd1\x0b\x0c\xdf\xe4\x87\xad\xe5\x94\x9e\xd8\xc7\x9e'  # 盐,必须是固定的字节值

kdf = PBKDF2HMAC(
    algorithm=hashes.SHA256(),
    length=32,
    salt=salt,
    iterations=100000,
    backend=default_backend()
)

key = base64.urlsafe_b64encode(kdf.derive(password))
print("生成的密钥:", key.decode())

# 使用生成的密钥进行加密解密操作
cipher = Fernet(key)

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

encrypted_data = cipher.encrypt(file_data)

with open('encrypted_with_password.txt', 'wb') as file:
    file.write(encrypted_data)

# 解密
with open('encrypted_with_password.txt', 'rb') as file:
    encrypted_data = file.read()

decrypted_data = cipher.decrypt(encrypted_data)

with open('decrypted_with_password.txt', 'wb') as file:
    file.write(decrypted_data)

print("使用密码生成密钥进行文件加密解密操作成功")

总结

本文详细介绍了如何使用Python的cryptography库进行文件加密和解密。通过生成密钥、加密文件、解密文件以及处理异常情况等步骤,展示了cryptography库的强大功能。此外,还介绍了使用密码生成密钥的进阶方法,以应对某些特定场景的需求。掌握这些技术,可以帮助大家在实际项目中更好地保护敏感数据,提升数据安全性。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rocky006

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值