【txt文本加密】使用 cryptography 库实现加密和解密

一、cryptography 库

cryptography 库是一个强大的 Python 库,用于实现加密和解密功能。它提供了各种加密算法,包括对称加密、非对称加密、哈希函数等。

  • 对称加密(Symmetric Encryption):使用 cryptography 库中的 Fernet 算法,通过相同的密钥进行加密和解密。
  • 非对称加密(Symmetric Encryption):使用 cryptography 库的 RSA 和 ECC 等算法,通过一对密钥(公钥和私钥)进行加密和解密。
  • 哈希(Hashing):cryptography 库提供了多种哈希函数,如 SHA-256、SHA-1、SHA-512 等。用于将任意长度的输入数据转换为固定长度的输出,通常用于安全存储密码、数据完整性验证等场景。

二、项目实战

2.1、对称加密和解密(生成加密文件)

2.1.1、输入文本语句(简版)

from cryptography.fernet import Fernet

key = Fernet.generate_key()
cipher_suite = Fernet(key)
cipher_text = cipher_suite.encrypt(b"A really secret message. Not for prying eyes.")
plain_text = cipher_suite.decrypt(cipher_text)
print(f"cipher_text = {cipher_text}")
print(f"plain_text = {plain_text}")

2.1.2、导入文本文件

在这里插入图片描述

from cryptography.fernet import Fernet  # pip install cryptography


"""
备注:使用Python的cryptography库中的Fernet类来对文本文件进行加密。
备注:在加密和解密过程中,密钥是至关重要的。如果密钥丢失,就无法解密文件。
"""
def generate_key():
    """生成一个新的密钥并将其保存到 secret.key 文件中。只需执行一次。"""
    key = Fernet.generate_key()  # 生成一个Fernet加密用的密钥
    print(f"密钥(secret.key) = {key}")  # 输出生成的密钥,方便查看(实际使用中应避免输出密钥)
    with open('secret.key', 'wb') as key_file:  # 以二进制写入模式打开一个名为'secret.key'的文件
        key_file.write(key)  # 将生成的密钥写入文件

def load_key():
    """从 secret.key 文件中读取密钥。"""
    return open('secret.key', 'rb').read()  # 以二进制读取模式打开'secret.key'文件,并读取其内容(密钥)

def encrypt_file(file_name):
    """读取原始文件内容,使用密钥进行加密,然后将加密后的内容写回文件。"""
    key = load_key()  # 调用load_key函数,加载密钥
    fernet = Fernet(key)  # 创建一个Fernet对象,用于加密操作

    with open(file_name, 'rb') as file:  # 以二进制读取模式打开指定的文件
        original = file.read()  # 读取文件的原始内容

    encrypted = fernet.encrypt(original)  # 使用Fernet对象对原始内容进行加密
    print(f"加密后的内容(encrypted) = {encrypted}")  # 输出加密后的内容(实际使用中应避免输出敏感数据)

    with open(file_name, 'wb') as encrypted_file:  # 以二进制写入模式打开指定的文件(覆盖原文件)
        encrypted_file.write(encrypted)  # 将加密后的内容写入文件

def decrypt_file(file_name):
    """读取加密后的文件内容,使用密钥进行解密,然后将解密后的内容写回文件。"""
    key = load_key()  # 调用load_key函数,加载密钥
    fernet = Fernet(key)  # 创建一个Fernet对象,用于解密操作

    with open(file_name, 'rb') as enc_file:  # 以二进制读取模式打开指定的文件(加密文件)
        encrypted = enc_file.read()  # 读取加密文件的内容

    decrypted = fernet.decrypt(encrypted)  # 使用Fernet对象对加密内容进行解密
    print(f"解密后的内容(decrypted) = {decrypted}")  # 输出解密后的内容(实际使用中应避免输出敏感数据)

    with open(file_name, 'wb') as dec_file:  # 以二进制写入模式打开指定的文件(覆盖加密文件)
        dec_file.write(decrypted)  # 将解密后的内容写入文件


if __name__ == '__main__':
    generate_key()              # 调用generate_key函数,生成并保存密钥(只需执行一次)
    encrypt_file('sample.txt')  # 调用encrypt_file函数,使用密钥对'sample.txt'文件进行加密
    decrypt_file('sample.txt')  # 调用decrypt_file函数,使用密钥对'sample.txt'文件进行解密

2.2、非对称加密和解密(生成加密文件)

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import padding


def generate_keys():
    """生成RSA密钥对(私钥和公钥),并将它们保存到文件中。"""
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048,
    )
    public_key = private_key.public_key()

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

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


def load_private_key():
    """从文件加载私钥。"""
    with open("private_key.pem", "rb") as private_file:
        private_key = serialization.load_pem_private_key(
            private_file.read(),
            password=None,
        )
    return private_key


def load_public_key():
    """从文件加载公钥。"""
    with open("public_key.pem", "rb") as public_file:
        public_key = serialization.load_pem_public_key(
            public_file.read()
        )
    return public_key


def encrypt_message(message, public_key):
    """使用公钥加密消息。"""
    encrypted_message = public_key.encrypt(
        message,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return encrypted_message


def decrypt_message(encrypted_message, private_key):
    """使用私钥解密消息。"""
    decrypted_message = private_key.decrypt(
        encrypted_message,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return decrypted_message


if __name__ == "__main__":
    # (1)生成密钥对
    generate_keys()
    # (2)加载密钥(公钥和私钥)
    public_key = load_public_key()
    private_key = load_private_key()
    # (3)要加密的消息
    message = b"This is a secret message"

    # (4)使用公钥加密消息
    encrypted_message = encrypt_message(message, public_key)
    print(f"Encrypted message: {encrypted_message}")
    # (5)使用私钥解密消息
    decrypted_message = decrypt_message(encrypted_message, private_key)
    print(f"Decrypted message: {decrypted_message}")

2.3、哈希函数(生成哈希对象)

from cryptography.hazmat.backends import default_backend  # 导入默认的加密后端模块
from cryptography.hazmat.primitives import hashes  # 导入哈希函数模块


def hash_data(data):
    """对输入的数据进行哈希处理并返回哈希值。"""
    digest = hashes.Hash(hashes.SHA256(), backend=default_backend())  # 创建 SHA-256 哈希对象
    digest.update(data)  # 更新哈希对象,处理输入数据
    hashed_data = digest.finalize()  # 完成哈希计算并获取最终哈希值
    return hashed_data


if __name__ == "__main__":
    # 要哈希的数据
    data = b"Hello, World!"  # 将字符串转换为字节字符串,作为示例数据

    # 计算哈希值
    hashed_data = hash_data(data)  # 调用 hash_data 函数进行哈希计算
    print(f"Hashed data (SHA-256): {hashed_data.hex()}")  # 打印计算得到的哈希值,转换为十六进制表示

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

胖墩会武术

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

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

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

打赏作者

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

抵扣说明:

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

余额充值