浅析RSA非对称加密算法

目录

引言

凯撒密码

对称加密

非对称加密

​编辑总结


引言

几月前在知乎上看到一个关于RSA公钥与私钥加解密的提问甚感兴趣,却一直没有时间去探究,今日浅得闲时以文记之。

在文章正式开始之前先讲一个小故事,在公元前58年时,凯撒带领他的军队征战四方,由于当时的通信手段远不及现代这样迅速便捷,书信甚至口头传文便是司空见惯的事情,即使在军队中也不例外。而这种方式带来的问题便是如何保证信息不泄露呢?对于当时的军队而言协同作战时信息泄露是非常可怕的事情,因此凯撒研究出了一种适用于当初场景下安全传输的方法,从而带领军队大获全胜。到底是什么样的方法使得凯撒在那个时期所向披靡呢?再往下看便会知道答案。

凯撒密码

引言中提到的便是著名的凯撒加密,凯撒加密的原理如下,通过使用字母表和一个偏移量v(密钥),从而实现对明文信息的加密。需要注意的是这里的字母是循环的,即Z右移3位后便是C,以此类推。

举个简单的例子,如下为26个字母组成的明文字母表,与之对应的便是通过移位3次后获取到的密文。

明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC

根据上述规则,很快我们可以知道如下密文:

KHOOR,ZRUOG!

对应的原文便是:

HELLO,WORLD!

虽然凯撒密码在目前来看已经不具备任何的安全性,无法保护信息载体,但在其被应用的那个时代却是非常重要的存在,作为古典密码的代表之一,为后来的密码体系奠定了基础。除此之外,凯撒密码也可看做最为简单的对称加密算法

对称加密

上一部分中提到了凯撒加密可以作为一个最为简单的加密算法,其原因是因为对称加密算法加密和解密使用了同样的密钥,与凯撒密码中的偏移量有异曲同工之妙。

对称加密算法的图示如下:

如图所示,对于通信双方A和B将使用同一个密钥来进行加密与解密,将明文数据通过密钥和加密算法结合后产生密文发送给B,B接收后通过相同密钥解出明文。

不难看出对称加密的特点是双方共用一个密钥,并且其加解密速度快,但与之而来的问题便是如果密钥Key泄露将导致通信双方的数据不再安全

目前市面上较为主流的对称加密算法为AES,其除需要密钥Key外还需要使用一个偏移量iv,并且提供了多种的数据填充模式,本文不做过多赘述。

非对称加密

在了解了对称加密后,终于可以请出我们的今天的主角——非对称加密,相比于上述提到的对称加密,非对称加密的特点是加解密一对密钥对,准确来说一般我们都使用的是公钥加密,私钥解密。而由于大整数因式分解在目前难以实现,因此RSA的安全性较高,但相比于对称加密其效率较低。

这里提到的公钥和私钥是指在使用非对称加密算法情况下生成的密钥对,私钥一般均保存给自己所持有,公钥则可以给任何人,因为使用公钥加密后的密文只有私钥才能解,因此即使当密文被拦截时,攻击者由于没有私钥将无法解密从而获取内容。

因此当A与B想要进行通信时,可以通过B发送的公钥对消息进行加密,而B在收到消息后可以通过自己的私钥实现消息解密查看。

当然也有存在“私钥签名,公钥验签”这种说法,其依赖于消息摘要算法为基础以实现。

回到文章开头的问题,一般来讲为“公钥加密,私钥解密”,事实上私钥也可加密,但一般来说并不会这样做,由于私钥可以推出公钥使其安全性尽失,并且私钥泄露也使加密失去了意义。

因此实际中使用RSA来加密通信信息时,事实上是通信双方各自生成了一对密钥对,双方通过交换公钥进而实现进一步通信。


总结

虽然RSA非对称加密算法提供了较高的安全性,但其性能却有所降低。本文所述以上场景为可信网络条件下,即不考虑诸如中间人攻击、公钥交换失败的情况,对于解决信息防篡改则需要引入消息摘要算法、数字签名作以辅助以确保数据的准确性和可靠性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

表内容的操作(增删查改)【MySQL】

文章目录 表的 CRUDCreate(增加)插入记录插入冲突则更新记录替换记录 Retrieve(查找)查找记录指定表达式的别名为结果去重WHERE 子句运算符条件查询区间查询模糊查询空值查询 对结果排序筛选分页结果 Update(修改&…

面试题c/c++ --STL 算法与数据结构

1.6 STL 模板 模板底层实现:编译器会对函数模板进行两次编译, 在声明的地方对模板代码本身进行编译, 在调用的地方对参数替换后的代码进行编译。 模板传参分析 模板重载 vector 是动态空间, 随着元素的加入, 它的内…

内存学习(4):内存分类与常用概念3(ROM)

1 ROM介绍 ROM即为只读存储器,全拼是Read Only Memory。 1.1 “只读”的由来 ROM叫只读存储器是因为最早的ROM(MROM)确实是只能读取不能写入,一旦出厂不能再写,需要在出厂之前预设好它的数据,并且它是掉…

Apache Airflow (十一) :HiveOperator及调度HQL

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹…

cpu飙高问题,案例分析(一)

一、复习知识点: CPU性能指标: load average:负载,linux查看的时候,通常显示如下: load average后面有三段数字:代表了系统1分钟,5分钟,15分钟平均负载。 形象的类别可…

【每日刷题——语音信号篇】

思考与练习 练习2.1 语音信号在产生的过程中,以及被感知的过程中,分别要经过人体的哪些器官? 1.产生过程: 肺部空气 → \rightarrow →冲击声带 → \rightarrow →通过声道(可以调节) → \rightarrow →…

【ArcGIS Pro微课1000例】0033:ArcGIS Pro处理cad数据(格式转换、投影变换)

文章目录 一、cad dwg转shp1. 导出为shp2. cad至地理数据库3. data interoperability tools二、shp投影变换一、cad dwg转shp 1. 导出为shp 加载cad数据,显示如下: 选择需要导出的数据,如面状,右键→数据→导出要素: 导出要素参数如下,点击确定。 导出的要素不带空间参…

el-table 对循环产生的空白列赋默认值

1. el-table 空白列赋值 对el-table中未传数据存在空白的列赋默认值0。使用el-table 提供的插槽 slot-scope&#xff1a;{{ row || ‘0’ }} 原数据&#xff1a; <el-table-column label"集镇" :propcity ><template slot-scope"{row}">{{…

Linux 命令补充

目录 tr 命令 命令举例 cut 命令 命令举例 uniq 命令 命令举例 sort 命令 命令举例 面试题 1. 给你一个文件如何提取前 10 的 IP 2. 如何提前 ss 中的状态 tr 命令 作用tr转换tr -d删除tr -c取反tr -s压缩 命令举例 cut 命令 作用cut提取cut -f指定列cut -d指定分…

MyBatis的xml实现

1.下载插件MyBatisX 2.添加依赖 <!--Mybatis 依赖包--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency><!--…

人工智能给我们的生活带来了巨大的影响?

1. 人工智能从哪些方面给我们带来了影响&#xff1f; 人工智能出现&#xff0c;极大地影响了人类的生活&#xff0c;下面是人工智能所影响的领域&#xff1a; 1. 日常生活 智能家居: AI驱动的设备&#xff0c;如智能扬声器、灯光、恒温器&#xff0c;正在改变我们与家居环境的…

猫12分类:使用yolov5训练检测模型

前言&#xff1a; 在使用yolov5之前&#xff0c;尝试过到百度飞桨平台&#xff08;小白不建议&#xff09;、AutoDL平台&#xff08;这个比较友好&#xff0c;经济实惠&#xff09;训练模型。但还是没有本地训练模型来的舒服。因此远程了一台学校电脑来搭建自己的检测模型。配置…

.NET 8.0 AOT 教程 和使用 和 .NET ORM 操作

NET AOT编译是一种.NET运行时的编译方式&#xff0c;它与传统的JIT编译方式不同。在传统的JIT编译中&#xff0c;.NET应用程序的代码在运行时才会被编译成本地机器码&#xff0c;而在AOT编译中&#xff0c;代码在运行之前就被提前编译成本地机器码。这样可以在代码运行的时候不…

Docker搭建Redis集群

Docker搭建Redis集群 创建一个专属redis的网络 docker network create redis --subnet 172.38.0.0/16通过shell脚本创建并启动6个redis服务 #通过脚本一次创建6个redis配置 for port in $(seq 1 6); \ do \ mkdir -p /mydata/redis/node-${port}/conf touch /mydata/redis/n…

CentOS7安装部署Kafka with KRaft

文章目录 CentOS7安装部署Kafka with KRaft一、前言1.简介2.架构3.环境 二、正文1.部署服务器2.基础环境1&#xff09;主机名2&#xff09;Hosts文件3&#xff09;关闭防火墙4&#xff09;JDK 安装部署 3.单机部署1&#xff09;下载软件包2&#xff09;修改配置文件3&#xff0…

VS2019编译安装GDAL(C++)程序库

一、GDAL简介 GDAL&#xff0c;全称Geospatial Data Abstraction Library&#xff0c;即地理空间数据抽象库&#xff0c;是一个在X/MIT许可协议下读写空间数据的开源库&#xff0c;可以通过命令行工具来进行数据的转换和处理。而在调用中我们常用的OGR&#xff08;OpenGIS Simp…

文件上传漏洞(CVE-2022-23043)

简介 CVE-2022-23043是一个与Zenario CMS 9.2文件上传漏洞相关的安全漏洞。该漏洞被定义为文件的不加限制上传&#xff0c;攻击者可以利用这个漏洞上传webshell以执行任意命令。利用这个漏洞的攻击者暂无特定情况。要利用此漏洞&#xff0c;攻击者首先需要访问Zenario CMS的管…

gin相关操作--一起学习921190764

gin官方文档 https://gin-gonic.com/docs/quickstart/1. 安装 go get -u github.com/gin-gonic/ginhttps://github.com/gin-gonic/gin简单入门 package mainimport ("github.com/gin-gonic/gin""net/http" )func pong(c *gin.Context) {//c.JSON(http.S…

Redis高级特性和应用(发布 订阅、Stream)

目录 发布和订阅 操作命令 发布消息 订阅消息 查询订阅情况 查看活跃的频道 查看频道订阅数 使用场景和缺点 Redis Stream Stream总述 常用操作命令 生产端 消费端 单消费者 消费组 创建消费组 消息消费 在Redis中实现消息队列 基于pub/sub 基于Stream Re…

Three.js相机模拟

有没有想过如何在 3D Web 应用程序中模拟物理相机? 在这篇博文中,我将向你展示如何使用 Three.js和 OpenCV 来完成此操作。 我们将从模拟针孔相机模型开始,然后添加真实的镜头畸变。 具体来说,我们将仔细研究 OpenCV 的两个失真模型,并使用后处理着色器复制它们。 拥有逼…