【python】python中非对称加密算法RSA实现原理与应用实战

news2024/11/16 19:41:25

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:python综合应用,基础语法到高阶实战教学
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Python中RSA加解密
    • 一、安装所需库
    • 二、生成RSA密钥对
      • 示例代码
    • 三、使用公钥加密数据
      • 示例代码
    • 四、使用私钥解密数据
      • 示例代码
    • 五、RSA签名与验证
      • 签名过程
      • 验证过程
    • 六、实际应用案例
      • 案例背景
      • 加密与签名过程
      • 解密与验证过程
      • 示例代码
        • Alice端代码
    • 七、总结

Python中RSA加解密

RSA加密算法是一种非对称加密算法,由罗纳德·李维斯特(Ron Rivest)、阿迪·沙米尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年提出。RSA算法的安全性基于大数分解的困难性,即已知两个大素数p和q的乘积n,求解p和q非常困难。RSA算法广泛应用于数据加密和数字签名等领域。

本文将详细介绍如何在Python中使用RSA算法进行加密和解密,包括密钥对的生成、加密过程、解密过程以及签名和验证签名的过程。同时,将结合具体案例进行说明。

一、安装所需库

在Python中使用RSA算法,首先需要安装pycryptodome库。这个库提供了完整的RSA加密和解密功能。可以使用pip命令进行安装:

pip install pycryptodome

二、生成RSA密钥对

RSA加密的第一步是生成一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据。公钥可以公开,而私钥需要保密。

示例代码

from Crypto.PublicKey import RSA
from Crypto.Random import get_random_bytes

# 生成RSA密钥对
key = RSA.generate(2048)  # 生成2048位的密钥

# 导出密钥
private_key = key.export_key()
with open("private.pem", "wb") as f:
    f.write(private_key)

public_key = key.publickey().export_key()
with open("public.pem", "wb") as f:
    f.write(public_key)

print("私钥已保存到private.pem")
print("公钥已保存到public.pem")

上述代码生成了一对2048位的RSA密钥对,并将私钥和公钥分别保存到private.pempublic.pem文件中。

三、使用公钥加密数据

有了公钥后,就可以使用公钥对明文数据进行加密。加密后的数据只有对应的私钥才能解密。

示例代码

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import base64

# 加载公钥
with open("public.pem", "rb") as f:
    public_key = RSA.import_key(f.read())

# 明文数据
message = "Hello, RSA Encryption!".encode('utf-8')

# 使用公钥加密
cipher = PKCS1_OAEP.new(public_key)
encrypted_message = cipher.encrypt(message)

# 将加密后的数据转换为base64编码,便于存储和传输
encrypted_message_b64 = base64.b64encode(encrypted_message).decode('utf-8')
print("加密后的数据(Base64编码):", encrypted_message_b64)

注意,这里使用了PKCS1_OAEP填充模式进行加密,它提供了比PKCS1_v1_5更好的安全性。

四、使用私钥解密数据

在收到加密的数据后,可以使用对应的私钥进行解密,还原出原始的明文数据。

示例代码

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import base64

# 加载私钥
with open("private.pem", "rb") as f:
    private_key = RSA.import_key(f.read())

# 加密数据(这里用之前生成的加密数据)
encrypted_message_b64 = "你的加密数据(Base64编码)"
encrypted_message = base64.b64decode(encrypted_message_b64)

# 使用私钥解密
cipher = PKCS1_OAEP.new(private_key)
decrypted_message = cipher.decrypt(encrypted_message)

print("解密后的数据:", decrypted_message.decode('utf-8'))

encrypted_message_b64替换为实际接收到的加密数据的Base64编码字符串。

五、RSA签名与验证

除了加密和解密外,RSA还可以用于数字签名,以确保数据的完整性和来源的可靠性。签名过程使用私钥,验证过程使用公钥。

签名过程

from Crypto.PublicKey import RSA
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256

# 加载私钥
with open("private.pem", "rb") as f:
    private_key = RSA.import_key(f.read())

# 待签名的数据
message = "这是一份需要签名的文件内容".encode('utf-8')

# 使用SHA256哈希函数对数据进行哈希
h = SHA256.new(message)

# 使用私钥进行签名
signer = pkcs1_15.new(private_key)
signature = signer.sign(h)

# 将签名转换为base64编码
signature_b64 = base64.b64encode(signature).decode('utf-8')
print("签名(Base64编码):", signature_b64)

验证过程

from Crypto.PublicKey import RSA
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
import base64

# 加载公钥
with open("public.pem", "rb") as f:
    public_key = RSA.import_key(f.read())

# 待验证的数据和签名
message = "这是一份需要签名的文件内容".encode('utf-8')
signature_b64 = "你的签名(Base64编码)"
signature = base64.b64decode(signature_b64)

# 使用SHA256哈希函数对数据进行哈希
h = SHA256.new(message)

# 使用公钥验证签名
verifier = pkcs1_15.new(public_key)
if verifier.verify(h, signature):
    print("签名验证成功,数据未被篡改。")
else:
    print("签名验证失败,数据可能被篡改。")

signature_b64替换为实际接收到的签名的Base64编码字符串。

六、实际应用案例

案例背景

假设Alice是一家公司的业务员,她在外地考察商机并发现了重要的商业信息。她需要将这个信息通过电子邮件发送给公司经理Bob。然而,电子邮件传输过程中存在安全风险,如数据被抓包、邮箱密码泄露等。为了确保信息的安全传输,Alice决定使用RSA加密算法对邮件内容进行加密,并使用私钥对邮件进行签名,以确保邮件的完整性和来源的可靠性。

加密与签名过程

  1. Alice生成RSA密钥对:Alice使用Python的pycryptodome库生成一对RSA密钥对,并将公钥发送给Bob。

  2. Alice加密邮件内容:Alice将发现的商业信息作为明文,使用Bob的公钥进行加密,得到密文。

  3. Alice签名邮件内容:Alice使用自己的私钥对邮件内容进行签名,得到签名信息。

  4. Alice发送邮件:Alice将加密后的邮件内容和签名信息一起通过电子邮件发送给Bob。

解密与验证过程

  1. Bob接收邮件:Bob收到Alice发送的加密邮件和签名信息。

  2. Bob解密邮件内容:Bob使用自己的私钥对加密的邮件内容进行解密,还原出原始的商业信息。

  3. Bob验证签名:Bob使用Alice的公钥对签名信息进行验证,确保邮件在传输过程中未被篡改,并且确实是Alice发送的。

示例代码

这里只给出Alice加密和签名的部分代码,Bob的解密和验证过程与前面介绍的过程类似。

Alice端代码
# 假设Alice已经获得了Bob的公钥,并保存在bob_public.pem文件中

# 加密邮件内容
encrypted_email_content = rsa_encrypt("重要商业信息".encode('utf-8'), bob_public_key)

# 签名邮件内容
signature = rsa_sign("重要商业信息".encode('utf-8'), alice_private_key, 'SHA-256')

# Alice将encrypted_email_content和signature通过电子邮件发送给Bob

注意:rsa_encryptrsa_sign函数是自定义的,用于封装加密和签名的过程,具体实现可以参考前面的示例代码。

七、总结

本文详细介绍了在Python中使用RSA算法进行加密、解密、签名和验证签名的过程。通过结合实际应用案例,展示了RSA算法在数据安全传输中的重要作用。希望大家通过本文能够掌握RSA算法的基本原理和Python实现方法,并在实际工作中加以应用。

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

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

相关文章

9.13 DFSBFS 简单 101 Symmetric Tree 104 Maximum Depth of Binary Tree

101 Symmetric Tree class Solution { public:// 比较两个向量是否镜像对称bool isIdentical(const std::vector<int>& n1, const std::vector<int>& n2) {int n n1.size();for (int i 0; i < n; i) {if (n1[i] ! n2[n - i - 1]) return false; // 镜…

AV1 Bitstream Decoding Process Specification--[2]:符号和缩写术语

原文地址&#xff1a;https://aomediacodec.github.io/av1-spec/av1-spec.pdf没有梯子的下载地址&#xff1a;AV1 Bitstream & Decoding Process Specification摘要&#xff1a;这份文档定义了开放媒体联盟&#xff08;Alliance for Open Media&#xff09;AV1视频编解码器…

通过LiveGBS实现安防监控摄像头GB28181转成WebRTC流实现web浏览器网页无插件低延迟直播...

目录 1、WebRTC超低延时直播2、WebRTC延时对比3、LiveGBS的低延时的WebRTC流4、分屏页面如何选择默认播放流5、无法播放Webrtc6、搭建GB28181视频直播平台 1、WebRTC超低延时直播 需要低延时的视频流监控播放&#xff0c;之前可以用rtmp的低延时播放(1秒左右)&#xff0c;随着浏…

三星ZFlip5/ZFlip4/W7024刷安卓14国行OneUI6.1系统-高级设置-韩/欧/港版

三星ZFlip5/ZFlip4/W7024系列手机&#xff0c;基本都是高端玩家的一个产品&#xff0c;目前虽然国内销量不 如其他品牌&#xff0c;但依旧表现不错&#xff0c;并且大家都不知道三星全球第一&#xff0c;自然在国外销量也比较OK 由于三星全部设备基本都支持解锁BL&#xff08;美…

Spring Boot基础

项目创建 项目启动 请求响应 RestController 1.返回值处理 RestController&#xff1a;这个注解结合了Controller和ResponseBody的功能。它默认将所有处理请求的方法的返回值直接作为响应体内容返回&#xff0c;主要用于构建RESTful API。返回的数据格式通常是JSON或XML&…

vue使用TreeSelect设置带所有父级节点的回显

Element Plus的el-tree-select组件 思路&#xff1a; 选中节点时&#xff0c;给选中的节点赋值 pathLabel&#xff0c;pathLabel 为函数生成的节点名字拼接&#xff0c;数据源中不包含。 在el-tree-select组件中设置 props“{ label: ‘pathLabel’ }” 控制选中时input框中回…

商务办公tips1:如何将网页转换为pdf

​ 场景需求&#xff1a; 商务轻办公人士获取网页内容&#xff0c;并且最好是pdf版本&#xff1f; 将网页转换为PDF的需求可能出现在多种场景中&#xff0c;以下是一些可能的情况&#xff1a; 学术研究&#xff1a;研究人员可能需要将某个学术网站的全文内容保存为PDF格式&a…

sqlgun靶场训练

1.看到php&#xff1f;id &#xff0c;然后刚好有个框&#xff0c;直接测试sql注入 2.发现输入1 union select 1,2,3#的时候在2处有回显 3.查看表名 -1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()# 4.查看列名…

【计网】从零开始使用UDP进行socket编程 --- 客户端与服务端的通信实现

人生不过如此&#xff0c;且行且珍惜。 自己永远是自己的主角&#xff0c; 不要总在别人的戏剧里充当着配角。 --- 林语堂 --- 从零开始学习socket编程---UDP协议 1 客户端与服务端的通信2 设计UDP服务器类2.1 基础框架设计2.2 初始化函数2.3 启动函数 3 设计客户端 1 客户…

会员计次卡渲染技术-—SAAS本地化及未来之窗行业应用跨平台架构

一、计次卡应用 1. 健身中心&#xff1a;会员购买一定次数的健身课程或使用健身房设施的权限。 2. 美容美发店&#xff1a;提供一定次数的理发、美容护理等服务。 3. 洗车店&#xff1a;车主购买若干次的洗车服务。 4. 儿童游乐场&#xff1a;家长为孩子购买固定次数的入场游…

分类预测|基于差分优化DE-支持向量机数据分类预测完整Matlab程序 DE-SVM

分类预测|基于差分优化DE-支持向量机数据分类预测完整Matlab程序 DE-SVM 文章目录 一、基本原理DE-SVM 分类预测原理和流程总结 二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 DE-SVM 分类预测原理和流程 1. 差分进化优化算法&#xff08;DE&#xff09; 原理…

跟《经济学人》学英文:2024年09月07日这期 How fashion conquered television

How fashion conquered television More and more shows celebrate fancy clothes. Often brands call the shots 原文&#xff1a; From Tokyo to Seoul, on to New York, London, Milan and Paris, there are more “fashion weeks” in September than there are weeks i…

【Pandas操作2】groupby函数、pivot_table函数、数据运算(map和apply)、重复值清洗、异常值清洗、缺失值处理

1 数据清洗 #### 概述数据清洗是指对原始数据进行处理和转换&#xff0c;以去除无效、重复、缺失或错误的数据&#xff0c;使数据符合分析的要求。#### 作用和意义- 提高数据质量&#xff1a;- 通过数据清洗&#xff0c;数据质量得到提升&#xff0c;减少错误分析和错误决策。…

sharding-jdbc metadata load优化(4.1.1版本)

背景 系统启动时&#xff0c;会注意sharding-jdbc提示加载metadata 于是想看看里面做了什么事情 问题追踪 debug后可以观察走到了该类 org.apache.shardingsphere.shardingjdbc.jdbc.core.context.ShardingRuntimeContext#loadSchemaMetaData 先看这个shardingRuntimeConte…

玉米种子质量检测系统源码分享

玉米种子质量检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

数据结构——栈和队列(队列的定义、顺序队列以及链式队列的基本操作)

目录 队列&#xff08;queue&#xff09;的定义 顺序队——队列的顺序表示和实现 顺序队列&#xff08;循环队列&#xff09;的类型定义 顺序队列上溢问题的解决方法 ​编辑 循环队列的基本操作 队列的基本操作——队列的初始化 队列的基本操作——求队列的长度 队列的…

[数据集][目标检测]岩石种类检测数据集VOC+YOLO格式4766张9类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4766 标注数量(xml文件个数)&#xff1a;4766 标注数量(txt文件个数)&#xff1a;4766 标注…

CurrentHashMap的底层原理

CurrentHashMap在jdk1.8之前使用的是分段锁&#xff0c;在jdk1.8中使用"CAS和synchronized"来保证线程安全。 jdk1.8之前的底层实现 CurrentHashMap在jdk1.8之前&#xff0c;通过Segment段来实现线程安全。 Segment 段 ConcurrentHashMap 和 HashMap 思路是差不多…

TDengine 签约前晨汽车,解锁智能出行的无限潜力

在全球汽车产业转型升级的背景下&#xff0c;智能网联和新能源技术正迅速成为商用车行业的重要发展方向。随着市场对环保和智能化需求的日益增强&#xff0c;企业必须在技术创新和数据管理上不断突破&#xff0c;以满足客户对高效、安全和智能出行的期待。在这一背景下&#xf…

如何通过 PhantomJS 模拟用户行为抓取动态网页内容

引言 随着网页技术的不断进步&#xff0c;JavaScript 动态加载内容已成为网站设计的新常态&#xff0c;这对传统的静态网页抓取方法提出了挑战。为了应对这一挑战&#xff0c;PhantomJS 作为一个无头浏览器&#xff0c;能够模拟用户行为并执行 JavaScript&#xff0c;成为了获…