目录

当我们进入一个数据泄露变得司空见惯的时代时,理解和实施安全数据传输比以往任何时候都更加重要。 Python 以其简单性和强大的功能而闻名,已成为加密实现中的关键角色。 在这篇文章中,我们将深入研究 Python 的 Cryptography 包,并探索它如何保护我们的数据安全。

一、密码学基础

密码学的核心是编码和解码的艺术。 它由加密(将纯文本转换为难以理解的文本)和解密(相反的过程)等技术组成。 密码是用于执行加密或解密的口令。

有两种主要的加密类型:

  1. 对称加密:加密和解密使用相同的密钥。
  2. 非对称加密:使用一对密钥——用于加密的公钥和用于解密的私钥。

非对称加密(又称为公钥加密)与对称加密相比具有几个关键优势:

1) 密钥分发和管理:非对称加密使用一对密钥(一个公钥和一个私钥)。公钥可以公开分享,用于加密数据,而私钥保持机密,用于解密数据。这解决了对称加密中的一个主要问题:安全地分发密钥。在对称加密中,同一个密钥用于加密和解密,因此必须安全地传递给通信双方,这在不安全的通道中是一个挑战。

2) 安全性:由于私钥从不共享,非对称加密通常被认为比对称加密更安全。即使公钥被公开,没有私钥,攻击者也无法解密信息。

3) 数字签名和身份验证:非对称加密可以用于创建数字签名。发送方用私钥对信息进行签名,接收方则用公钥验证签名。这不仅确保了信息的完整性,还验证了发送方的身份,为通信提供了额外的安全层。

然而,非对称加密也有其缺点。它通常比对称加密慢得多,因为它依赖于更复杂的数学运算。因此,在实际应用中,常常将两者结合使用:使用非对称加密安全地交换对称加密的密钥,然后使用对称加密进行实际的数据传输。这种方法结合了两者的优点,提供了既安全又高效的加密解决方案。

二、Cryptography 包简介

Python 中的 Cryptography 包是一个强大的库,为常见的加密算法提供高级和低级接口。 它对于初学者来说用户友好,对于专家来说足够安全。

Cryptography 是一个开源软件,源代码见https://github.com/pyca/cryptography

Cryptography 的官方文档见https://cryptography.io/en/latest/

您可以通过在终端中运行以下命令,使用 Python 包管理器 pip 安装 Cryptography:

pip install cryptography

或从国内清华源安装(速度快):

pip install cryptography -i https://pypi.tuna.tsinghua.edu.cn/simple

三、示例

让我们深入研究一些实际示例:

(一) 示例1:使用 Fernet 对字符串进行对称加密

下面的代码演示了如何对一个字符串进行对称加密和解密的过程。

from cryptography.fernet import Fernet

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

# 要加密的中文字符串
text_to_encrypt = "Hello 小土豆"

# 将字符串转换为UTF-8编码的字节类型
encoded_text = text_to_encrypt.encode('utf-8')

# 使用Fernet加密
cipher_text = cipher_suite.encrypt(encoded_text)

# 输出加密后的内容
print("加密后的内容:", cipher_text)

# 解密
decrypted_text = cipher_suite.decrypt(cipher_text)

# 将字节类型的解密内容转换回字符串
decoded_text = decrypted_text.decode('utf-8')

# 输出解密后的内容
print("解密后的内容:", decoded_text)

输出:

加密后的内容: b'gAAAAABlr2gdwXccVz1Tzfk5Ks0ltyd8mjK-pfQlIWBnITju6TtuSTc-J3xkYL0Ao6WjjGTPyWIIaQbV97Pef9Lu1R9IA8vpBQ=='

解密后的内容: Hello 小土豆

(二) 示例2:使用 Fernet 对文件进行对称加密

下面的代码既适用于文本文件,也适用于二进制文件,因为使用的是二进制模式('rb' 和 'wb')来读写文件。

from cryptography.fernet import Fernet
import os

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

def encrypt_file(file_path, encrypted_file_path):
    # 读取文件内容
    with open(file_path, 'rb') as file:
        file_data = file.read()

    # 使用Fernet加密文件内容
    encrypted_data = cipher_suite.encrypt(file_data)

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

def decrypt_file(encrypted_file_path, decrypted_file_path):
    # 读取加密的文件内容
    with open(encrypted_file_path, 'rb') as file:
        encrypted_data = file.read()

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

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

# 示例文件路径
file_path = 'example.txt' # 假设这是您要加密的文件
encrypted_file_path = 'encrypted_example.txt' # 加密后的文件
decrypted_file_path = 'decrypted_example.txt' # 解密后的文件

# 加密文件
encrypt_file(file_path, encrypted_file_path)

# 解密文件
decrypt_file(encrypted_file_path, decrypted_file_path)

(三) 示例3:使用 RSA 对字符串进行非对称加密

下面的代码演示了如何对一个字符串进行非对称加密和解密的过程。

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes

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

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

# 要加密的消息
message_to_encrypt = "Hi 小菠萝"

# 将字符串转换为UTF-8编码的字节
encoded_message = message_to_encrypt.encode('utf-8')

# 加密
encrypted = public_key.encrypt(
    encoded_message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# 解密
decrypted_message = private_key.decrypt(
    encrypted,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# 将解密后的字节转换回字符串
decoded_message = decrypted_message.decode('utf-8')

# 打印解密后的内容
print("解密后的内容: ", decoded_message)

输出:

解密后的内容: Hi 小菠萝

(四) 示例4:使用 RSA 对文件进行非对称加密

下面的代码演示了如何对一个文件进行非对称加密和解密的过程。

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes

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

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

def encrypt_file(file_path, encrypted_file_path):
    # 读取文件内容
    with open(file_path, '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(encrypted_file_path, 'wb') as file:
        file.write(encrypted_data)

def decrypt_file(encrypted_file_path, decrypted_file_path):
    # 读取加密的文件内容
    with open(encrypted_file_path, 'rb') as file:
        encrypted_data = file.read()

    # 解密文件内容
    decrypted_data = private_key.decrypt(
        encrypted_data,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )

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

# 示例文件路径
file_path = 'example.txt'  # 假设这是您要加密的文件
encrypted_file_path = 'encrypted_example.txt'  # 加密后的文件路径
decrypted_file_path = 'decrypted_example.txt'  # 解密后的文件路径

# 加密文件
encrypt_file(file_path, encrypted_file_path)

# 解密文件
decrypt_file(encrypted_file_path, decrypted_file_path)

四、结论

密码学在数字安全中的集成是不可或缺的,Python 的 Cryptography 包使这项技术变得易于使用。 无论您是新手还是专家,Cryptography 包都会让您的信息和文件变得安全,它是保护您数据安全的大锁。


相关博客文章

相关书籍教程文章
官方公众号

💯本站文章同步发表在官方公众号 ReadingHere,关注公众号您将在第一时间了解本站最新文章和资讯。

❤️欢迎您关注本站官方公众号 ReadingHere


版权声明

本文由ReadingHere原创,未经ReadingHere授权不得转载、摘编。已经授权使用的,应在授权范围内使用,并注明来源: www.readinghere.com。违反上述声明者,ReadingHere将追究其相关法律责任。


交流合作

如需交流咨询或商务合作请扫描下图微信二维码联系。