当前位置: 首页 > article >正文

Python 如何进行密码学操作(cryptography模块)

Python 的密码学操作可以通过 cryptography 模块来实现,这个模块是一个功能强大的库,它提供了现代密码学的基本工具,包括加密、解密、密钥生成、签名等操作。cryptography 模块易于使用,并且安全性高,适合在各种场景下使用。

一、安装 cryptography 模块

在开始之前,你需要确保已经安装了 cryptography 模块。如果没有安装,可以通过以下命令来安装:

pip install cryptography

安装完成后,可以通过 import cryptography 来导入库,并使用其功能。

二、密码学基础知识

在讨论 cryptography 模块之前,了解一些密码学的基础知识是非常有必要的。

  1. 对称加密:对称加密使用相同的密钥进行加密和解密操作。常见的对称加密算法包括 AES(高级加密标准)、DES(数据加密标准)等。

  2. 非对称加密:非对称加密使用一对公钥和私钥。公钥用于加密,私钥用于解密。常见的非对称加密算法包括 RSA、DSA 等。

  3. 哈希函数:哈希函数将任意长度的数据转换为固定长度的哈希值,常见的哈希算法包括 SHA-256、MD5 等。

  4. 消息认证码(MAC):消息认证码用于验证数据的完整性和真实性。HMAC 是一种常见的消息认证码,它基于哈希函数和一个密钥生成认证码。

  5. 数字签名:数字签名用于验证数据的来源和完整性。签名过程使用私钥对数据进行签名,验证过程使用对应的公钥。

三、cryptography 模块的结构

cryptography 模块分为两个主要部分:

  1. 高级加密API(Fernet):提供了易于使用的对称加密工具。
  2. 低级加密API:提供了更复杂的加密工具,如对称加密算法、非对称加密算法、哈希函数等。

接下来,我们将详细介绍这些部分的用法。

四、高级加密 API

cryptography 模块的高级加密 API 主要通过 Fernet 类来实现。Fernet 是对称加密的一种实现,使用 AES 算法,并包含生成密钥、加密和解密的功能。

1. 密钥生成

使用 Fernet 进行加密时,首先需要生成一个密钥:

from cryptography.fernet import Fernet

# 生成密钥
key = Fernet.generate_key()
print(f"Generated key: {key.decode()}")

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

这段代码生成了一个密钥,并将其保存到文件中。

2. 加密操作

有了密钥后,可以使用 Fernet 对数据进行加密:

# 加载密钥
key = None
with open("secret.key", "rb") as key_file:
    key = key_file.read()

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

# 要加密的数据
message = b"Hello, this is a secret message!"

# 加密数据
cipher_text = cipher_suite.encrypt(message)
print(f"Encrypted message: {cipher_text}")
3. 解密操作

解密操作与加密操作类似,只需调用 decrypt 方法:

# 解密数据
decrypted_message = cipher_suite.decrypt(cipher_text)
print(f"Decrypted message: {decrypted_message.decode()}")

通过以上代码,已经完成了基本的加密和解密操作。

五、低级加密 API

低级加密 API 提供了更多的加密算法和操作,适合高级用户自定义加密方案。我们将重点介绍对称加密、非对称加密、哈希函数和数字签名。

1. 对称加密

对于对称加密,cryptography 提供了如 AES、DES 等算法。我们以 AES 为例,介绍如何使用。

1.1 加密和解密

使用 AES 进行加密时,通常需要选择一个模式(如 CBC、CFB 等),并提供一个初始化向量(IV)。以下是使用 AES-CBC 模式的示例:

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
import os

# 生成密钥和初始化向量
key = os.urandom(32)  # 256-bit key for AES-256
iv = os.urandom(16)   # 128-bit IV for CBC mode

# 要加密的数据
message = b"Secret message for AES encryption"

# 创建 AES-CBC 对象
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
encryptor = cipher.encryptor()

# 对数据进行加密
cipher_text = encryptor.update(message) + encryptor.finalize()
print(f"Encrypted message: {cipher_text}")

# 解密
decryptor = cipher.decryptor()
decrypted_message = decryptor.update(cipher_text) + decryptor.finalize()
print(f"Decrypted message: {decrypted_message.decode()}")
2. 非对称加密

非对称加密通常用于加密密钥、数字签名等场景。我们以 RSA 为例,演示如何生成密钥对、加密、解密以及数字签名。

2.1 生成密钥对

首先,生成一个 RSA 密钥对:

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization

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

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

# 导出公钥并保存
public_key = private_key.public_key()
pem = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)
with open("public_key.pem", "wb") as key_file:
    key_file.write(pem)
2.2 加密和解密

使用公钥加密数据,使用私钥解密数据:

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(), backend=default_backend())

# 加密数据
message = b"Encrypted message using RSA"
cipher_text = public_key.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)
print(f"Encrypted message: {cipher_text}")

# 加载私钥
with open("private_key.pem", "rb") as key_file:
    private_key = serialization.load_pem_private_key(key_file.read(), password=None, backend=default_backend())

# 解密数据
decrypted_message = private_key.decrypt(
    cipher_text,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)
print(f"Decrypted message: {decrypted_message.decode()}")
2.3 数字签名

数字签名用于验证数据的完整性和来源。使用私钥对数据进行签名,使用公钥验证签名。

# 签名
signature = private_key.sign(
    message,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)
print(f"Signature: {signature}")

# 验证签名
try:
    public_key.verify(
        signature,
        message,
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    print("Signature is valid.")
except Exception as e:
    print("Signature is invalid.")
3. 哈希函数

哈希函数生成数据的唯一摘要,用于数据完整性验证。以下是使用 SHA-256 算法生成哈希值的示例:

from cryptography.hazmat.primitives import hashes

# 创建哈希对象
digest = hashes.Hash(hashes.SHA256(), backend=default_backend())

# 更新数据
digest.update(b"Data to hash")
digest.update(b"More data to hash")

# 完成哈希计算
hash_value = digest.finalize()
print(f"Hash value: {hash_value.hex()}")
4. 消息认证码(MAC)

HMAC 是一种常见的消息认证码,结合了哈希函数和密钥,用于验证消息的完整性和真实性。

from cryptography.hazmat.primitives import hmac

# 生成 HMAC
h = hmac.HMAC(key, hashes.SHA256(), backend=default_backend())
h.update(b"Message to authenticate")
mac_value = h.finalize()
print(f"MAC value: {mac_value.hex()}")

# 验证 HMAC
h.verify(mac_value)
print("MAC is valid.")

通过 cryptography 模块,可以实现对称加密、非对称加密、哈希函数、消息认证码和数字签名等密码学功能。对于不同的应用场景,可以选择合适的算法和模式,以确保数据的机密性、完整性和真实性。

cryptography 模块不仅功能强大,还具有良好的文档支持,使得开发者可以轻松地在 Python 中实现各种密码学操作。


http://www.kler.cn/news/284751.html

相关文章:

  • 通帆科技“液氢微型发电站”:点亮氢能产业新征程
  • Mysql的InnoDB存储引擎
  • Unity-高版本的 bundle 资源路径的变化
  • 在大语言模型中,生成文本的退出机制,受max_generate_tokens限制,并不是所有的问答都完整的跑完整个transformer模型
  • 红黑树模拟实现STL中的map与set——C++
  • React 学习——zustand切片拆分
  • BUUCTF PWN wp--jarvisoj_level0
  • 入行「游戏策划」,该从何处下手?
  • 【FPGA】入门学习路线
  • 【QNX+Android虚拟化方案】114 - QNX /dev/switch 节点创建 及 读写功能实现实例
  • 3d网格补洞算法
  • 实测数据处理(RD算法处理)——SAR成像算法系列(十)
  • Python编码系列—Python中的安全密码存储与验证:实战指南
  • 每日一题,零基础入门FPGA——逻辑门
  • NFC射频--天线设计
  • 集成电路学习:什么是BIOS基本输入/输出系统
  • pytorch 均方误差损失函数
  • C_08_动态内存申请
  • 未来城市生活:科技与人文的交响
  • Docker 实战加速器(紧急情况!镜像库全面失效,一招解决Docker无法下载)
  • 云轴科技ZStack产品升级,浙江分公司产品发布会成功举办
  • tailwindcss
  • 《黑神话:悟空》:30%抽成真相
  • 如何使用 AWS CLI 为私有 AWS S3 存储桶中的对象创建预签名 URL
  • 2016年系统架构师案例分析试题五
  • 前端面试——八股文
  • 又一个免费代码生成工具
  • C++ TinyWebServer项目总结(11. 定时器)
  • 【C++】OJ习题 篇2
  • Spring 是什么