Python PyCryptodome库介绍与实例

Python PyCryptodome库介绍与实例

    • 1. 安装
    • 2. 基本概念
    • 3. 使用场景和示例代码
      • 3.1 对称加密 - AES
      • 3.2 非对称加密 - RSA
      • 3.3 哈希函数 - SHA256
      • 3.4 消息认证码 - HMAC
    • 4. 总结

PyCryptodome是一个强大的Python加密库,提供了各种加密算法和工具。本文将介绍PyCryptodome的基本概念和常见使用场景,并通过示例代码展示如何使用该库。

1. 安装

首先,我们需要安装PyCryptodome库:

pip install pycryptodome

2. 基本概念

PyCryptodome提供了以下几种主要类型的加密算法:

  • 对称加密: AES, DES, 3DES等
  • 非对称加密: RSA, DSA, ECC等
  • 哈希函数: SHA256, MD5等
  • 消息认证码(MAC): HMAC
  • 数字签名

3. 使用场景和示例代码

3.1 对称加密 - AES

AES (Advanced Encryption Standard) 是一种广泛使用的对称加密算法。以下是使用AES加密和解密的示例:

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpaddef encrypt_aes(plaintext, key):cipher = AES.new(key, AES.MODE_ECB)padded_data = pad(plaintext.encode(), AES.block_size)return cipher.encrypt(padded_data)def decrypt_aes(ciphertext, key):cipher = AES.new(key, AES.MODE_ECB)padded_data = cipher.decrypt(ciphertext)return unpad(padded_data, AES.block_size).decode()# 生成一个16字节的随机密钥
key = get_random_bytes(16)# 加密
message = "Hello, PyCryptodome!"
encrypted = encrypt_aes(message, key)
print(f"加密后: {encrypted.hex()}")# 解密
decrypted = decrypt_aes(encrypted, key)
print(f"解密后: {decrypted}")

3.2 非对称加密 - RSA

RSA是一种常用的非对称加密算法,适用于数据加密和数字签名。以下是RSA加密和解密的示例:

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import binascii# 生成RSA密钥对
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()# 加密
message = b"Hello, RSA!"
rsa_public_key = RSA.import_key(public_key)
rsa_public_key = PKCS1_OAEP.new(rsa_public_key)
encrypted = rsa_public_key.encrypt(message)
print(f"加密后: {binascii.hexlify(encrypted)}")# 解密
rsa_private_key = RSA.import_key(private_key)
rsa_private_key = PKCS1_OAEP.new(rsa_private_key)
decrypted = rsa_private_key.decrypt(encrypted)
print(f"解密后: {decrypted.decode()}")

3.3 哈希函数 - SHA256

哈希函数用于生成消息摘要,常用于数据完整性检查和密码存储。以下是使用SHA256哈希的示例:

from Crypto.Hash import SHA256def hash_sha256(data):hash_object = SHA256.new(data=data.encode())return hash_object.hexdigest()message = "Hello, SHA256!"
hashed = hash_sha256(message)
print(f"SHA256哈希值: {hashed}")

3.4 消息认证码 - HMAC

HMAC (Hash-based Message Authentication Code) 用于验证消息的完整性和真实性。以下是HMAC的使用示例:

from Crypto.Hash import HMAC, SHA256def create_hmac(key, message):hmac = HMAC.new(key, msg=message.encode(), digestmod=SHA256)return hmac.hexdigest()def verify_hmac(key, message, received_mac):hmac = HMAC.new(key, msg=message.encode(), digestmod=SHA256)try:hmac.hexverify(received_mac)return Trueexcept ValueError:return False# 创建HMAC
secret_key = b"my_secret_key"
message = "Hello, HMAC!"
mac = create_hmac(secret_key, message)
print(f"HMAC: {mac}")# 验证HMAC
is_valid = verify_hmac(secret_key, message, mac)
print(f"HMAC验证结果: {is_valid}")

4. 总结

PyCryptodome提供了丰富的加密功能,可以满足多种安全需求。本文介绍了几个常见的使用场景,包括对称加密、非对称加密、哈希函数和消息认证码。在实际应用中,请根据具体需求选择合适的加密算法和参数,并确保正确管理密钥。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/866690.shtml

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

相关文章

【专业指南】移动硬盘坏道下的数据恢复之道

移动硬盘坏道揭秘:数据安全的隐形挑战 在数据日益成为核心资产的今天,移动硬盘作为便携存储的代名词,承载着无数用户的重要信息。然而,随着使用时间的增长和不当操作的影响,移动硬盘可能会遭遇“坏道”这一棘手问题。…

眼动追踪技术 | 眼动的分类和模型

摘要 灵长类动物用于调整中央凹位置的正常眼动,几乎都可以归结为五种基本类型的组合:扫视、平稳追踪、聚散、前庭眼震和生理性眼震(与注视相关的微小运动)。聚散运动用于将双眼聚焦于远处的目标(深度知觉)。其他运动(如适应和聚焦)指的是眼动的非位置变…

密码学原理精解【5】

这里写目录标题 移位密码概述代码 希尔密码( Z 256 Z_{256} Z256​)待加密长度被3整除待加密长度不一定被3整除加解密文件 移位密码 概述 以 z 26 运算为例 , k 为密钥 加密: e k ( x ) ( x k ) m o d 26 解密: d k ( x ) ( x − k ) m o d 26 以z_{…

Linux权限介绍

目录 1.用户切换 2.权限 (1)权限介绍 (2)文件类型 (3)权限组成 (4)权限修改 (5)重新认识 (6)底层操作 (一&#x…

Vite 中怎么添加全局 scss 文件

使用 Vite 开发项目,配套周边生态使用起来,开发效率会很高。但也会有一些问题需要解决。 当我们使用 scss 时,希望能够把一些定义变量,定义mixin 的文件全局加载,避免每处用到还要单独引入这些文件。 这就需要一些配…

事件分发机制:demo复现自定义ViewGroup点击事件不起作用

几年前遇到的一个bug,不弄清楚心里就是不舒服! 平时应用开发中,经常遇到的UI需求,例如抖音的设置界面,如下图所示: 很容易想到,自定义一个Layout,左边一个图标,中间文…

无痕消除笔怎么用?3款工具教你完美消除

无痕消除笔怎么用?无痕消除笔在图片编辑中扮演着至关重要的角色。它利用先进的图像处理技术,让用户只需简单几步操作,就能轻松抹除图片上任何不想要的细节,无论是明显的瑕疵、多余的文字还是恼人的水印。这一功能不仅提高了编辑效…

华为大咖说 企业应用AI大模型的“道、法、术” -- 法:落地篇 (上)

本文作者:郑岩(华为云AI变革首席专家)全文约2865字,阅读约需7分钟 在探讨企业如何应用AI大模型的“道、法、术”系列文章的前两篇文章中,我们已经深化了对“AI大模型”的理解,并通过“AI场景12问”洞察了潜…

鸿蒙 HarmonyOS Next 路由 不废话 全干货

一、页面的创建 (1)直接通过创建一个新的Page的方式创建 (2)先创建一个 ArkTs File文件,然后在resources/base/profile/main_pages.json中加上页面对应的src路径,下面的Index_3.ets文件是通过创建ArkTs Fi…

【区分vue2和vue3下的element UI Breadcrumb 面包屑组件,分别详细介绍属性,事件,方法如何使用,并举例】

在 Vue 2 中,Element UI 提供了 el-breadcrumb 面包屑组件,而在 Vue 3 中,Element UI 的官方版本并没有直接更新以支持 Vue 3,但有一个类似的库叫做 Element Plus,它是为 Vue 3 设计的。 Vue 2 Element UI 在 Vue 2…

Linux安装达梦

文章目录 前言一、docker安装1.下载镜像2.导入镜像3.生成容器 二、ios安装1.环境准备2.iso安装3.配置实例4.注册服务5.启停服务 总结 前言 公司要求我将数据从oracle迁移到达梦数据库,这个国产数据库以前没用过,所以记录一下这次的安装过程。 一、docke…

【代码随想录算法训练营第五十八天|卡码网101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿】

文章目录 101.孤岛的总面积102.沉没孤岛103.水流问题正向逻辑反向逻辑 104.建造最大岛屿 101.孤岛的总面积 可以把最外围的都检查一遍是否有为1的,有的话就把他接壤的全变成海,然后正常算面积。也可以看岛屿是否有靠边的位置,有的话该岛面积…

后端部署Jar包 | 启动失败系列问题(图解-BuiId,Maven)

目录 项目的构建 打包前的准备 合理配置pox.xml文件 Build 打包方式 Maven打包方式 Jar包部署 测试后端接口 项目的构建 我的项目是SpringBoot2脚手架 先准备一个相对于的数据库依赖 数据库的任意库 Yaml配置后 才能正常在IDEA中跑起来 打包前的准备 合理配置pox.xm…

rs轨迹校验

最近发现有些网站的rs似乎上了轨迹校验,附图: 写了个解rscookie的插件,可以精准看到rs更改了那些校验点,需要做什么处理,就很舒服 有需要轨迹代码或者瑞数相关的可以联系 let v huaqu0727

Cmake qt_add_library

目录 基本用法 参数说明 示例 创建一个新的Qt项目 创建CMakeLists.txt ​​​​​创建库的源文件 创建主程序文件 构建项目 在Qt中,qt_add_library 是一个用于在CMake构建系统中添加库的命令。这个命令通常用于创建一个新的Qt库,并将其添加到CMa…

李彦宏:大模型公司要注重AI实际应用,写高考作文价值有限

李彦宏在2024世界人工智能大会上表示,大模型公司不应只关注写高考作文,而应更多地投入到实际应用中。这话说得有道理,不过我们也不能忽视探索性尝试的价值。接下来,我们来具体谈谈这个问题。 大模型在实际应用中的重要性 李彦宏…

性能测试:JMeter与Gatling的高级配置

性能测试是软件开发过程中不可或缺的一部分,它帮助我们确保应用在高负载下仍能保持良好的响应时间和稳定性。本文将深入探讨两种流行的性能测试工具:Apache JMeter和Gatling,并提供详细的高级配置指南以及Java代码示例。 Apache JMeter 高级…

uniapp小程序IOS端,uni.createInnerAudioContext()无声音

可能的问题 路径中有中文字符需要使用uni.getBackgroundAudioManager()播放其他问题 解决办法 首先我的路径中没有中文字符,如果有的,可能需要转义一下或者干脆不使用中文字符,第二个也是从其他博客中看到的,我这边分享一下我的…

【Qt】QTableView通过setColumnWidth设置了列宽无效

1. 解决 将模型设置给表格视图之后,再设置tableveiw的列宽。 2. 参考 https://blog.csdn.net/ml29895063/article/details/132716687

Feign远程调用,请求头丢失情况

现象 解决方案 import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.request.RequestContextHolde…