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

news2024/9/22 19:29:26

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.coloradmin.cn/o/2090916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软件测试】8. 测试分类

目录 1. 为什么要对软件测试进行分类? 2.按照测试目标分类 2.1 界面测试 2.2 功能测试 2.3 性能测试 2.4 可靠性测试 2.5 安全性测试 2.6 易用性测试 3.按照执行方式分类 3.1 静态测试 3.2 动态测试 4. 按照测试方法 4.1 白盒测试 4.2 黑盒测试 4.3灰…

【WiFi协议的发展学习1】

WiFi协议的发展 WiFi协议的发展2. WiFi协议发展3. WiFi协议发展小结3.1. 发展归纳3.2. 未来展望4. WiFi产品的特点/功能WiFi协议的发展 自20世纪90年代以来, WiFi技术得到了迅猛发展,已成为人们日常生活、工作和学习中不可或缺的组成部分。WiFi协议的发展不仅推动了无线通信…

TL-Tomcat 整体架构和处理请求流程解析

我们写一个servlet后,在web.xml里配上我们的路径。然后把项目打包成war包放入webapps目录下 然后这样就返回了 这个war包里面的东西和这个文件夹其实是一样的: 那么最终我们把war包删掉 还有原来文件夹下其他的东西 只剩下这么个.class文件 其实这…

TikTok流量推送逻辑与IP的关系

在探讨TikTok流量推送逻辑时,很多用户都好奇这一机制是否与用户的IP地址紧密相关。TikTok作为全球知名的短视频社交平台,其流量推送算法无疑是平台成功的关键因素之一。那么,TikTok的流量推送逻辑究竟是如何运作的?它与IP地址之间…

C语言 | Leetcode C语言题解之第385题迷你语法分析器

题目: 题解: struct NestedInteger* helper(const char * s, int * index){if (s[*index] [) {(*index);struct NestedInteger * ni NestedIntegerInit();while (s[*index] ! ]) {NestedIntegerAdd(ni, helper(s, index));if (s[*index] ,) {(*index…

使用InternLM实现谁是卧底游戏

环境 # 创建虚拟环境 conda create -n spy python3.10 -y conda activate spy pip install streamlit1.37.0 openai1.37.1 git clone https://github.com/sci-m-wang/Spy-Game.git cd Spy-Game 修改脚本who_is_the_spy.py中的client 部分 if "client" not in …

pdf转cad软件,5款快速上手转换软件分享

在当今快节奏的工作环境中,图纸文件的格式转换成为设计师、工程师等职业群体日常工作中不可或缺的一环。尤其是将PDF文件转换为CAD格式,不仅能够提升工作效率,还能确保设计数据的准确性和可编辑性。下面给大家分享5款能够快速上手转换软件&am…

快蜗牛OZON数据分析工具,快蜗牛OZON选品工具

现在电商行业蓬勃发展的时代,OZON是俄罗斯及东欧边相当重要的电商平台,它背后的数据里藏着超多商业机会。快蜗牛数据专门针对 OZON 平台搞数据分析的,能帮咱们卖家看透市场,还能指导商家怎么做生意。接下来看快蜗牛对 OZON 的数据…

物理机安装Centos后无法连接网络(网线网络)怎么办?-呕心沥血总结版-超简单

问题情境 高高兴兴的在物理机上装了个centos7,打开一看,哇,网卡没有我的局域网IP,怎么办,已经插上网线了呀,灯也在闪烁,怎么没有网络呀? 其实,是缺少网卡驱动! 问题解决: 1.查询网卡版本 在服务器上输入命令: lspci | grep Ethernet可以看到,我的网卡是RTL8…

Python Excel 操作全面总结

Excel 是我们日常生活中经常使用的数据处理工具,而 Python 作为一种强大的编程语言,在处理 Excel 文件方面也有着广泛的应用。本文将全面总结 Python Excel 操作,包括如何使用 Python 来读取、写入、修改 Excel 文件,以及如何使用…

2024全国大学生数学建模国赛,成员如何分工协作?

文末获取2024国赛数学建模思路代码,9.5开赛后第一时间更新 大家知道,数学建模竞赛是需要一个团队的三个人在三天或四天的时间内,完成模型建立,编程实现和论文写作的任务,对许多第一次参加建模或者建模经验比较欠缺的团…

电饭煲语音应用方案:工业级性能、简单易用,NRK3301语音识别ic

随着人们对电器的需求不断增大,家用电饭煲经过不断地改革和创新,拥有了更多使用的功能,以往电饭煲只用于煮米饭。如今,还增加了煲汤、煮粥、无水焗、收汁入味等十多种功能。 除此之外,如今的电饭煲越来越人性化&#x…

AI周报(8.25-8.30)

AI应用-Beyond Math 的“数字风洞”应用于 F1 赛车 Beyond Math 的首批市场之一是一级方程式赛车,一些车队正在探索使用该软件来加快他们的空气动力学和车辆设计过程。 BeyondMath 的联合创始人达伦加维(Darren Garvey)告诉TechCrunch&#…

【MySQL-24】万字全面解析<索引>——【介绍&语法&性能分析&使用规则】

前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《Lin…

一文打通前端环境搭建

目录 nvm管理安装nvm 管理node配置nvm环境变量切换nvm国内镜像 安装nodenpm 镜像切换打包工具yarn安装yarnyarn切换淘宝镜像 安装vue脚手架开发工具vscode安装(傻瓜式安装) 启动项目vue插件配置 关于yarmyarm常用命令 nvm管理 安装nvm 管理node 访问github地址:ht…

Electron 项目实战 02:打包和自动更新

技术选型 electron-forgeelectron-builder electron-forge 是Electron 官方文档介绍的,打包和发布都包含了,但是包含的坑也非常多。electron-builder下载量和集成打包非常顺利,本教程也是采用electron-buid来介绍打包。大家在技术选型的时候…

火绒补充| 截止目前修改时间| 本文已上全站总榜33

目录 为什补充? 用户界面优化: 性能提升: 启发式检测和行为分析: 恶意网址拦截: 系统修复功能: 网络安全防护: 云查杀引擎: 漏洞修复和补丁管理: 隐私保护&…

算法的学习笔记—把数组排成最小的数(牛客JZ45)

😀前言 在编程面试中,经常会遇到需要将问题转化为排序问题的题目。这些问题看似复杂,但只要抓住核心思路,便能迅速解决。今天我们就来看一道这样的题目:如何将一个非负整数数组拼接成最小的数字。 🏠个人主…

Cracking the Safe

原题链接:https://leetcode.cn/problems/cracking-the-safe/description/ 题目要求的是,某个时刻能够打开保险箱的任一最短密码序列,需要包含所有密码子串。 答案应当是一个字符串,任意长度为n的子串的都是一种密码方案。 对于有n…

探索前沿科技:在本地系统上安装和使用Style TTS2进行高质量语音合成

我们正处于一个令人激动的时代,有如此多的选择,不仅在大型语言模型方面,还有现在的文本到语音(TTS)模型。在这篇文章中,我将向您展示如何在本地系统上轻松安装这个非常出色的模型——Style TTS2&#xff0c…