RSA加密

RSA加密是一种非对称加密算法(与AES等对称加密不同),由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)于1977年提出,名字取自三人姓氏首字母。它通过一对密钥(公钥和私钥) 实现加密和解密,是目前应用最广泛的非对称加密技术之一。

核心特点:

  1. 非对称密钥体系

    • 公钥:可公开传播,用于加密数据或验证签名。
    • 私钥:必须保密,用于解密公钥加密的数据,或生成签名。
      核心逻辑:用公钥加密的数据,只有对应的私钥能解密;用私钥加密的数据(签名),只有对应的公钥能验证。
  2. 安全性基础
    基于大数分解难题:将两个大质数相乘容易,但要分解其乘积(得到原始质数)在计算上几乎不可行。密钥长度越长(如2048位、4096位),破解难度呈指数级增长,目前2048位及以上被认为足够安全。

  3. 加密与解密效率
    因涉及复杂的大数运算,RSA加密速度远慢于对称加密(如AES),因此不适合加密大量数据,通常用于加密对称加密的密钥(即“混合加密”),或用于数字签名。

典型应用场景:

  • 密钥交换:在HTTPS、VPN等通信中,用对方公钥加密对称加密的密钥,确保密钥安全传输(如TLS握手阶段)。
  • 数字签名:发送方用私钥对数据哈希值加密(生成签名),接收方用公钥验证签名,确认数据未被篡改且来自合法发送方(如软件签名、电子合同)。
  • 身份认证:通过验证私钥持有者的身份(如SSH登录用公钥认证)。

示例(生成公钥和私钥) :

"""
@File    : 非对称加密RSA.py
@Editor  : 百年
"""
'''
非对称加密,加密和解密的密钥不是同一个密钥,而是需要两把密钥
一个是公钥,一个是私钥,公钥发送给客户端,发送端用公钥对数据进行加密,
再发送给接收端,接收端使用私钥来对数据进行解密,
由于私钥只存放在接收端这边,
所以即使数据被截获了,也是无法进行解密的
常见的非对称加密算法:RSA,DSA
rsa是最常见的一种加密方案 
公钥是用来加密的
私钥是用来解密的
密钥(私钥)不能公开
公钥和私钥是成对的,是有一定的关联的 
加密和解密用的不是同一个密钥,私钥放在服务器上不公开
'''
from Crypto.PublicKey import RSA  #这是处理密钥的
from Crypto import Random
import base64
# 生成密钥,默认生成的是私钥
key = RSA.generate(2048)
print(key)
# Private RSA key at 0x1D92A324690  生成了私钥,后面跟的是内存地址# print(key.export_key())
# print(key.exportKey()) #tips:这俩一样的
private_key = key.export_key()
# print(private_key)
#直接这样输出的是base64字节而且带有换行符
# 可以decode,将base64字节转换为b64字符串
print(private_key.decode())# private_key_b = key.export_key(format='DER') #输出纯字节的私钥
# print(private_key_b)#生成公钥puiblic_key = key.public_key()
print(puiblic_key)
# Public RSA key at 0x227A7D9ADD0
print(puiblic_key.export_key())
#这样打印也是有换行符的
print(puiblic_key.export_key().decode())
#还得decode
'''
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuTelupiUOptxRuq0HdXe
wvxw7mfpE45uxPGybbFWCykczUjthcsrnfe33zX6GikGN8O/h1Z2LGvslkupeGYB
mixLnTMTahL45P2o92szSb9xiixa50FrfFCwkkuCTcpHARkMDMawAIH+xt+bKjq9
DJKHXTaTpjrcaqXI38TYwMtGYRFJhOQr39B3P28UNAa03gKbajh4sRSA0WF6I8My
wdZZmmccW6q+rgZOs92UCwUTd4ZmzweU2FQeailhLrQWTbO9g/w9HLtFFgUWx6Vf
2WO8S5zEBPFHqbvh1Kjtvn9HK+w12uM7NDBdLgMg0PgU9AfGNzDj2pOU+drdPzbM
uwIDAQAB
-----END PUBLIC KEY-----
'''#这正使用过程中,服务器一开始就会直接写入到文件当中去#important:注意写入的是二进制
#写出私钥
with open('private.pem','wb') as f:f.write(key.export_key())#写出公钥
with open('public.pem','wb') as f1:f1.write(key.public_key().export_key())

示例(用公钥加密)

"""
@File    : 使用自己的rsa密钥加密.py
@Editor  : 百年
"""'''
加密流程是客户端最有用的地方
解密流程是发生在服务器端的
'''from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64#step1 :加载密钥,需要的是公钥,公钥是用来加密的
#这里用我们上一个文件中生成的公钥
#export是导出,那么我们就可以用import进行导入
# tips: 可以读字节import_key(b'b64密钥',),也可以读字符串
pub_k = RSA.import_key(open('public.pem','rb').read())
#step2 :创建加密器的流程和之前的AES,DES很像
rsa = PKCS1_v1_5.new(key=pub_k)#step3 :进入加密逻辑
s = 'hello,我叫hero,你是??'
enc_s = rsa.encrypt(s.encode('utf-8'))print(enc_s)
#打印出来是混乱字节
#step4 :为了传输,需要利用base64进行编码enc_s = base64.b64encode(enc_s)
print(enc_s.decode())
#important:rsa加密后的东西,如果不是纯数学算法,每次都是随机的
'''
FfXEjq4Uy3zikwtTMVw+q9HqmhSyoMkUjI/VaA/JrKkp/gdLgqlKCg+0s+dttvtlDKdLE2L+WD0hseEFXhSo7hVo3aQyevtzOAokZY0ZM5Anq+hQSt4EyBxnco7ABe3iCYTJuUEqWIw0bnUB+Fq9tRshDwKsBwNCKQ2TBjM8QSUmcGa9Zvy/pdY4sPM9FGKe3vYcsejnmAbnp3llIcquSjO+clUrCI9/4HDB2bB5yxw4trxVtDukxtMWYZgyYDBvW1waL6i70h9F7/blTNSJiE5GSfktENHXY1tQsQuSpQx9N7N8sLLpIDMmmFfqv122GPncbA1zz7eoGU/Vncopkg=='''

示例(用私钥解密):


"""
@File    : 使用私钥进行解密.py
@Editor  : 百年
"""
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64#密文
miwen = 'FfXEjq4Uy3zikwtTMVw+q9HqmhSyoMkUjI/VaA/JrKkp/gdLgqlKCg+0s+dttvtlDKdLE2L+WD0hseEFXhSo7hVo3aQyevtzOAokZY0ZM5Anq+hQSt4EyBxnco7ABe3iCYTJuUEqWIw0bnUB+Fq9tRshDwKsBwNCKQ2TBjM8QSUmcGa9Zvy/pdY4sPM9FGKe3vYcsejnmAbnp3llIcquSjO+clUrCI9/4HDB2bB5yxw4trxVtDukxtMWYZgyYDBvW1waL6i70h9F7/blTNSJiE5GSfktENHXY1tQsQuSpQx9N7N8sLLpIDMmmFfqv122GPncbA1zz7eoGU/Vncopkg=='#step1:因为是base64字符串,先将其转换为字节
b_s = base64.b64decode(miwen)
print(b_s)#构建解密器,对其进行解密
#step2:读取自己的私钥,但其实我们一般不考虑解密的事情,这是交给服务器端的pri_k = RSA.import_key(open('private.pem','rb').read())
# pri_k = RSA.import_key(k) 或者直接写的话就导入字节格式的密钥
rsa = PKCS1_v1_5.new(key=pri_k)
s = rsa.decrypt(b_s,sentinel='None') #important:注意这里要求要有一个位置参数表示报错后该参数执行,是规定,虽然用不到但是也要强制指定
print(s)
# b'hello,\xe6\x88\x91\xe5\x8f\xabhero,\xe4\xbd\xa0\xe6\x98\xaf??'#step3:还原
print(s.decode()) #tips:因为默认是utf-8,这里就不指定了
# hello,我叫hero,你是??

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

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

相关文章

Java BeanUtils 类详解:作用、语法与示例

一、BeanUtils 的核心作用BeanUtils 是 Apache Commons 和 Spring Framework 提供的工具类,主要用于简化 JavaBean 的操作。核心功能包括:属性拷贝:对象间同名属性自动复制动态访问:通过字符串名称操作属性类型转换:自…

PyCharm高效开发全攻略

安装与基础配置下载PyCharm专业版或社区版(免费)并完成安装。首次启动时选择默认设置或自定义主题、字体大小等界面偏好。配置Python解释器路径(推荐使用虚拟环境),确保项目依赖隔离。快捷键与导航熟悉核心快捷键能大幅…

Pycharm 给 python 程序打包EXE的配置和方法

前言: Python 语言的设计变得越来越简单,它有很多可以使用的库,所以尤其在人工智能时代,Python语言被广泛应用。但是Python语言和windows系统的兼容性稍微偏弱,如何生成windows可以执行的exe文件。是要一个很复杂的配置过程,本文就会做一个介绍。 本文,通过一个Python…

【Linux | 网络】传输层(UDP和TCP)

目录一、再谈端口号1.1 端口号1.2 端口号的范围划分1.3 常见知名端口号1.4 netstat 命令1.5 进程与端口号的关系1.6 pidof 命令二、UDP协议2.1 UDP协议段格式2.2 如何理解UDP报头和UDP报文2.2.1 UDP报头2.2.2 UDP报文和UDP报文的管理2.2.3 UDP封装过程2.3 UDP的特点2.4 UDP的缓…

mybatisX的自定义模板生成

在idea中使用mybtais的自定义模板生成,可以帮我们省去很多重复的代码。 打开一个项目,我们要修改的主要就两个文件,一个是生成的mapper接口,另一个是xml文件: 相应的mapper接口模板为: package ${mapper…

miniz:一个轻量级、高性能的开源压缩库

目录 1.简介 2.核心特性 3.基本使用示例 4.与 ZLIB 的对比 5.使用场景 6.注意事项 1.简介 miniz 是一个轻量级、高性能的开源压缩库,专注于提供 ZLIB/GZIP 兼容的压缩和解压缩功能。它的核心优势在于体积小巧(单文件实现)、跨平台支持和…

Jenkins接口自动化测试(构建)平台搭建

Python接口自动化测试零基础入门到精通(2025最新版)自动化测试流程 在进行平台搭建前,我们首先要问自己:我需要搭建的平台的功能是什么,要实现什么目标? 在我的理解中,自动化构建平台的执行流…

Day 22: 复习

机器学习数据处理与降维技术复习总结 前言 经过6天的学习,我们系统地学习了从基础的Numpy数组操作到高级的降维算法,这些内容构成了机器学习数据预处理的重要知识体系。本文将对这一系列学习内容进行全面复习和总结,帮助大家建立完整的知识…

力扣 hot100 Day56

46. 全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 //抄的 class Solution { private:vector<vector<int>>result;vector<int> path; public:void backtracking(vector<int>& nu…

Android 编码规范全指南

在 Android 开发领域&#xff0c;代码不仅是功能实现的载体&#xff0c;更是团队协作与项目迭代的基础。一套完善的编码规范&#xff0c;能让代码从 “可运行” 升级为 “易维护、可扩展、低风险”。本文基于 Google、Square 等顶尖团队的实践经验&#xff0c;结合国内 Android…

[RPA] Excel中的字典处理

案例1一个Excel文件总共有2个Sheet页&#xff0c;分别为总表和对照表通过对照表sheet页&#xff0c;设置价格对照字典对照表循环总表sheet页&#xff0c;根据循环到的商品名称&#xff0c;找到对应字典中的价格&#xff0c;并计算出总价总表将总价写入到Excel表中C列&#xff0…

基于NSGAII优化算法的车间生产调度matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.部分程序 4.算法理论概述 5.参考文献 6.完整程序 1.程序功能描述 车间生产调度是制造业的核心环节&#xff0c;其目标是在满足设备约束、工序优先级等条件下&#xff0c;优化多个相互冲突的生产指标&#xff08;如…

Cmake、VS2019、C++、openGLopenCV环境安装

在 CMake 和 Visual Studio 2019 环境下安装和配置 OpenGL、OpenCV 以及 CUDA 可能会有些复杂&#xff0c;因为涉及的组件多且相互依赖。以下是一个详细的指南&#xff0c;帮助您逐步完成安装和配置。 1. 前提条件 在开始之前&#xff0c;请确保您已安装以下软件&#xff1a; …

视频二维码在产品设备说明书中的应用

在当今数字化的时代&#xff0c;传统的产品设备说明书正面临着一场变革。文字和图片虽然能提供基本信息&#xff0c;但在复杂设备的安装、操作和故障排除方面&#xff0c;往往显得力不从心。而视频二维码的出现&#xff0c;为这一困境提供了完美的解决方案&#xff0c;它将冰冷…

【Pytest 使用教程】

pytest 使用 test_basic.py Pytest 完全实战手册 一、核心概念与基础 1、在pytest框架下运行测试用例&#xff0c;最基础的一共有三点。导入pytest的包写一个方法&#xff0c;或者类。后面运行的时候&#xff0c;相当于运行这个方法&#xff0c;或者类里的方法&#xff0c;无需…

基于OpenOCD 的 STM32CubeIDE 开发烧录调试环境搭建 DAPLINK/STLINK

需要部署一个开发环境,实现h7的板子通过daplink功能给目标板烧写程序(同事要将这个过程用fpga实现),需要通过openocd+gdb+daplink stm32; 总结:单条命令执行太麻烦,参考4写成脚本文件: 独立脚本使用Openocd ​ 在**“在Stm32CubeIDE环境下使用DAP-Link仿真”**一文中…

嵌入式硬件篇---zigbee无线串口通信问题

使用 ZigBee 进行无线串口通信时&#xff0c;接收异常&#xff08;如丢包、乱码、完全无法接收&#xff09;是常见问题&#xff0c;其原因涉及射频通信特性、网络机制、硬件配置、环境干扰等多个层面。以下从具体机制出发&#xff0c;详细分析可能的原因&#xff1a;一、射频层…

【AI周报】2025年7月26日

【AI周报】2025年7月第四周观察&#xff1a;GitHub Spark重塑开发范式&#xff0c;中美AI政策对垒升级 省流版静态页面周报&#xff0c;为方便各位看官快速食用&#xff0c;我准备了摘要版周报&#xff0c;欢迎访问&#xff1a;20250726周报 引言&#xff1a;本周焦点速览 2…

HTML:从 “小白” 到 “标签侠” 的修炼手册

目录 一、HTML&#xff1a;网页的 “骨架” 不是骷髅架 二、文本标签&#xff1a;文字的 “华丽变身” 术 1. 标题标签&#xff1a;文字界的 “领导班子” 2. 段落标签&#xff1a;文字的 “专属保姆” 3. 文本格式化标签&#xff1a;给文字 “穿花衣” 三、链接标签&…

python3GUI--基于YOLO的火焰与烟雾检测系统By:PyQt5(详细图文介绍)

文章目录一&#xff0e;前言1.引言2.正文二&#xff0e;核心内容1.数据集2.模型训练3.界面窗口1.登录注册界面2.核心功能界面3.检测告警提示窗口三&#xff0e;.核心界面模块介绍1.顶部信息区域2.数据输入3.参数配置4.告警设置5.操作台6.关于7.指标变化8.异常速览9.日志输出10.…