RSA算法:开启现代密码学的数学之钥
一、RSA算法简介
RSA(Rivest-Shamir-Adleman)是当今应用最广泛的非对称加密算法,由三位科学家Ron Rivest、Adi Shamir和Leonard Adleman于1977年提出。它的核心思想是利用数论中的难题,构建一对数学上关联的密钥——公钥用于加密,私钥用于解密。使用公、私钥分离这种机制完美解决了对称加密中密钥分发的难题,成为互联网安全通信(如HTTPS、数字签名等)的基石。
二、RSA算法核心思想
算法目标
- 设计一种易于密钥分发的密码算法,以区别于对称密钥;
- 设计两把密钥,一把用于加密,一把用于解密。同时密钥不容易被破解;
- 加密密钥可以随意分发,只能用于加密,无法解密。
核心思想
根据算法目标,需要设计加密、解密两个过程,并且保证加密过程不可逆(即加密密钥不能解密出密文)。通过以下几步完成算法设计的目标。
- 利用模运算的不可逆性(即单向性)来设计加密和解密过程。
- 利用大质数分解困难的机制设计两把密钥
- 加密:将明文 m m m 通过指数运算和模运算转换为密文 c c c:
c ≡ m e ( m o d n ) c \equiv m^e \pmod{n} c≡me(modn) - 解密:将密文 c c c 通过指数运算和模运算还原为明文 m m m:
m ≡ c d ( m o d n ) m \equiv c^d \pmod{n} m≡cd(modn)
为了实现这一点,需要找到一对指数 e e e 和 d d d,使得:
( m e ) d ≡ m ( m o d n ) (m^e)^d \equiv m \pmod{n} (me)d≡m(modn)
三、RSA算法的数学基础
要理解RSA,需要掌握几个数学知识。
- 模运算
即“取余数运算”。例如 17 m o d 5 = 2 17 \mod 5 = 2 17mod5=2,表示17除以5的余数是2。
模运算的不可逆性是指在模 n n n下,某些运算(如乘法或指数运算)难以通过逆向操作恢复原始值。模运算的不可逆性原因在于信息丢失。模运算会将结果限制在 0 0 0 到 n − 1 n-1 n−1 之间,导致多个不同的输入可能映射到同一个输出。- 例如, 3 × 4 ≡ 12 ≡ 2 ( m o d 10 ) 3 \times 4 \equiv 12 \equiv 2 \pmod{10} 3×4≡12≡2(mod10),但 3 × 14 ≡ 42 ≡ 2 ( m o d 10 ) 3 \times 14 \equiv 42 \equiv 2 \pmod{10} 3×14≡42≡2(mod10)。仅知道结果是 2,无法确定原始值是 4 还是 14。
- 逆元
- 单位元:在一个集合中,对于某种运算 ∗ * ∗(注意:这里代表通用运算的表示符号,并不是特指乘法),如果对于任何的集合元素 a a a ,和元素 e e e运算,得到还是集合元素 a a a本身,则称 e e e为这个运算下的单位元。
示例:
在加法运算中,任意实数 a a a,根据单位元的定义,有 a + e = e + a = a a+e=e+a=a a+e=e+a=a。因为 a + 0 = 0 + a = a a+0=0+a=a a+0=0+a=a,则单位元为 0 0 0。
在乘法运算中,任意实数 a a a,根据单位元的定义,有 a × e = e × a = a a \times e=e \times a=a a×e=e×a=a。因为 a × 1 = 1 × a = a a \times 1=1 \times a=a a×1=1×a=a,则单位元为 1 1 1。
在模乘运算中(即左右操作数是求余运算的乘法),任意实数 a a a的模n运算 a ( m o d n ) a \pmod n a(modn),根据单位元的定义,有 a ( m o d n ) × e ( m o d n ) = e ( m o d n ) × a ( m o d n ) = a ( m o d n ) a \pmod n \times e \pmod n=e \pmod n \times a \pmod n=a \pmod n a(modn)×e(modn)=e(modn)×a(modn)=a(modn)。因为 a ( m o d n ) × 1 ( m o d n ) = 1 ( m o d n ) × a ( m o d n ) = a ( m o d n ) a \pmod n \times 1 \pmod n=1 \pmod n \times a \pmod n=a \pmod n a(modn)×1(modn)=1(modn)×a(modn)=a(modn),则单位元为 1 ( m o d n ) 1 \pmod n 1(modn)。附:证明过程。 - 逆元:在一个集合中,对于某种运算 ∗ * ∗,如果任意两个元素的运算结果等于单位元,则称这两个元素互为逆元。
示例:
在加法运算中,任意实数 a a a的逆元为 − a -a −a。因为加法的单位元为 0 0 0,根据逆元的定义,可令 a + e = e + a = 0 a+e=e+a=0 a+e=e+a=0,则 e = − a e=-a e=−a。即相反数。
在乘法运算中,任意实数 a a a的逆元为 a − 1 a^{-1} a−1或 1 a \frac{1}{a} a1。因为乘法的单位元为 1 1 1,根据逆元的定义,可令 a × e = e × a = 1 a \times e=e \times a=1 a×e=e×a=1,则 e = a − 1 e=a^-1 e=a−1或 e = 1 a e=\frac{1}{a} e=a1。即倒数。
在模乘中,设定模乘的逆元表示为 a − 1 ( m o d n ) a^-1 \pmod n a−1(modn)。因为模乘的单位元为 1 ( m o d n ) 1 \pmod n 1(modn),根据逆元的定义,可令 a ( m o d n ) × a − 1 ( m o d n ) = 1 ( m o d n ) a \pmod n \times a^{-1} \pmod n = 1 \pmod n a(modn)×a−1(modn)=1(modn)。根据模运算的性质,即等号左右两边模 n n n同余,所以前述式子可写为 a × a − 1 ≡ 1 ( m o d n ) a \times a^{-1} \equiv 1 \pmod n a×a−1≡1(modn)。为求得 a − 1 a{-1} a−1,可采用扩展欧几里德定理求解逆元。
- 单位元:在一个集合中,对于某种运算 ∗ * ∗(注意:这里代表通用运算的表示符号,并不是特指乘法),如果对于任何的集合元素 a a a ,和元素 e e e运算,得到还是集合元素 a a a本身,则称 e e e为这个运算下的单位元。
- 欧拉函数
符号 ϕ ( n ) \phi(n) ϕ(n),表示小于 n n n 且与 n n n 互质的正整数个数。- 关键性质:若 n = p × q n = p \times q n=p×q( p p p 和 q q q 为质数),则:
ϕ ( n ) = ( p − 1 ) × ( q − 1 ) \phi(n) = (p-1) \times (q-1) ϕ(n)=(p−1)×(q−1)
ϕ ( n ) = ( p − 1 ) × ( q − 1 ) \phi(n) = (p-1) \times (q-1) ϕ(n)=(p−1)×(q−1)是欧拉函数的一个特殊形式(当 n n n是两个不同的质数 p p p和 q q q时成立)。
示例: n = 15 = 3 × 5 n=15=3 \times 5 n=15=3×5,则 ϕ ( 15 ) = 2 × 4 = 8 \phi(15) = 2 \times 4 = 8 ϕ(15)=2×4=8,即与15互质的数为 {1,2,4,7,8,11,13,14}。
- 关键性质:若 n = p × q n = p \times q n=p×q( p p p 和 q q q 为质数),则:
- 欧拉定理
若 m m m 与 n n n 互质,则:
m ϕ ( n ) ≡ 1 ( m o d n ) m^{\phi(n)} \equiv 1 \pmod{n} mϕ(n)≡1(modn) - 大数分解问题
大质数在数轴上的分布非常稀疏,且没有明显规律可循,使得暴力搜索不可行。黎曼猜想即是想解决质数分布问题。 - 离散对数问题
c = m e ( m o d ϕ ( n ) ) c=m^e \pmod{\phi(n)} c=me(modϕ(n)),可以简单理解为有 ϕ ( n ) \phi(n) ϕ(n)个房间, c c c是其中一个房间,问题是找到一个整数 e e e(可以理解为步数),让你从房间 m m m出发,走多少步(求 e e e)能到达房间 c c c。而通常 ϕ ( n ) \phi(n) ϕ(n)与 e e e都是非常大的质数,且 ϕ ( n ) \phi(n) ϕ(n)未知,你需要一步步验证才能找到正确的 e e e(即使 e e e通常取值为65537)。
四、RSA的加密与解密过程
RSA的实现分为密钥生成、加密和解密三个阶段:
1. 密钥生成
- 步骤1:随机选择两个大质数 p p p 和 q q q。
- 步骤2:计算模数 n = p × q n = p \times q n=p×q和 ϕ ( n ) = ( p − 1 ) × ( q − 1 ) \phi(n) = (p-1) \times (q-1) ϕ(n)=(p−1)×(q−1)。
- 步骤3:选择公钥指数 e e e,需满足 1 < e < ϕ ( n ) 1 < e < \phi(n) 1<e<ϕ(n) 且 e e e 与 $ \phi(n)$ 互质(例如 e = 65537 e=65537 e=65537)。
- 步骤4:计算私钥指数 d d d,使得 e × d ≡ 1 ( m o d ϕ ( n ) ) e \times d \equiv 1 \pmod{\phi(n)} e×d≡1(modϕ(n))。即求 e ( m o d ϕ ( n ) ) e \pmod{\phi(n)} e(modϕ(n))的模乘逆元。
数学工具:使用扩展欧几里得算法求模乘逆元。
最终密钥对:
- 公钥: ( n , e ) (n, e) (n,e)
- 私钥: ( n , d ) (n, d) (n,d)
2. 加密过程
假设Bob想发送明文 m m m 给Alice:
- Bob获取Alice的公钥 ( n , e ) (n, e) (n,e)。
- 将明文转换为整数 m m m(如ASCII码),且 m < n m < n m<n。
- 计算密文 c ≡ m e ( m o d n ) c \equiv m^e \pmod{n} c≡me(modn),发送 c c c 给Alice。
3. 解密过程
Alice收到密文 c c c 后:
- 使用私钥 ( n , d ) (n, d) (n,d) 计算 m ≡ c d ( m o d n ) m \equiv c^d \pmod{n} m≡cd(modn)。
- 将整数 m m m 还原为原始信息。
数学证明:
由欧拉定理可证明,若 m m m 与 n n n 互质,则:
c d ≡ ( m e ) d ≡ m e × d ≡ m k ⋅ ϕ ( n ) + 1 ≡ ( m ϕ ( n ) ) k ⋅ m ≡ 1 k ⋅ m ≡ m ( m o d n ) c^d \equiv (m^e)^d \equiv m^{e \times d} \equiv m^{k \cdot \phi(n) + 1} \equiv (m^{\phi(n)})^k \cdot m \equiv 1^k \cdot m \equiv m \pmod{n} cd≡(me)d≡me×d≡mk⋅ϕ(n)+1≡(mϕ(n))k⋅m≡1k⋅m≡m(modn)
安全性
- 公钥 ( n , e ) (n, e) (n,e)是公开的
- 根据 e e e、 d d d的关系, e × d ≡ 1 ( m o d ϕ ( n ) ) e \times d \equiv 1 \pmod{\phi(n)} e×d≡1(modϕ(n))可知,如果想破解 d d d,则需要知道 ϕ ( n ) \phi(n) ϕ(n)
- 而 ϕ ( n ) = ( p − 1 ) × ( q − 1 ) \phi(n)=(p-1) \times (q-1) ϕ(n)=(p−1)×(q−1), n = p × q n=p \times q n=p×q,如果想破解 ϕ ( n ) \phi(n) ϕ(n)或 n n n,则需要知道 p p p、 q q q
- 但从 n n n分解出 p p p和 q q q在计算上是困难的,因此想破解 p p p、 q q q是不可能的。——依据大数分解问题
- 如果想绕开 p p p、 q q q,在未知 d d d的情况下,从 c ≡ m e ( m o d n ) c \equiv m^e \pmod n c≡me(modn)反推 m m m是困难的(即从密文直接反推明文是困难的)。——依据离散对数问题)
五、示例演示
以 p = 3 p=3 p=3、 q = 5 q=5 q=5 为例:
- n = 3 × 5 = 15 n = 3 \times 5 = 15 n=3×5=15, ϕ ( n ) = 2 × 4 = 8 \phi(n) = 2 \times 4 = 8 ϕ(n)=2×4=8。
- 选 e = 3 e=3 e=3(需与8互质)。
- 求 d d d,使得 3 d ≡ 1 ( m o d 8 ) 3d \equiv 1 \pmod{8} 3d≡1(mod8),解得 d = 3 d=3 d=3。
- 加密:若 m = 2 m=2 m=2,则 c = 2 3 m o d 15 = 8 c = 2^3 \mod 15 = 8 c=23mod15=8。
- 解密: 8 3 m o d 15 = 512 m o d 15 = 2 8^3 \mod 15 = 512 \mod 15 = 2 83mod15=512mod15=2。
六、总结
RSA通过巧妙的数学设计,将加密强度建立在大数分解、离散对数的复杂性上。公钥加密、私钥解密的非对称性,使得信息传输既安全又便捷。其背后依赖的欧拉定理与模运算,不仅是数论的瑰宝,更是现代数字社会的安全支柱。理解RSA,不仅是学习一个算法,更是窥见数学与工程完美融合的窗口。
欢迎关注个人公众号:小虫子编程课

相关文章:
RSA算法:开启现代密码学的数学之钥
一、RSA算法简介 RSA(Rivest-Shamir-Adleman)是当今应用最广泛的非对称加密算法,由三位科学家Ron Rivest、Adi Shamir和Leonard Adleman于1977年提出。它的核心思想是利用数论中的难题,构建一对数学上关联的密钥——公钥用于加密…...
【从0到1构建实时聊天系统:Spring Boot + Vue3 + WebSocket全栈实战】
一、项目架构 技术栈清单: 后端:Spring Boot 3.0 WebSocket STOMP前端:Vue3 Pinia WebSocket Client部署:Nginx Docker Compose 二、核心功能实现 1. WebSocket双向通信 // 后端配置类 Configuration EnableWebSocketMes…...
HTML 超链接(简单易懂较详细)
在 HTML 中,超链接是通过 <a> 标签(anchor tag)创建的。超链接允许用户通过点击文本、图像或其他元素跳转到另一个网页、文件或页面的特定部分。本文将详细介绍 HTML 超链接的语法、属性和应用场景。 一、基本语法 <a href"U…...
《Android应用性能优化全解析:常见问题与解决方案》
目录 一、UI卡顿/掉帧 二、内存泄漏(Memory Leak) 三、ANR(Application Not Responding) 四、列表滑动卡顿(RecyclerView/ListView) 五、冷启动耗时过长 六、内存抖动(Memory Churn&#x…...
常见HTTP 状态码及意义
HTTP状态码是服务器响应客户端请求时返回的三位数字代码,它们分为五个类别,每个类别代表不同类型的响应。 1xx - 信息性状态码 这些状态码表示请求已被接收,继续处理。 100 Continue: 客户端应继续其请求。这个临时响应用于通知客户端&…...
Android Compose Surface 完全指南:从入门到花式操作
今天咱们来聊聊 Compose 世界里那个既基础又强大的组件——Surface。这个看似简单的矩形区域,实际藏着不少宝藏玩法,准备好你的 IDE,咱们发车! 一、Surface 是什么? 简单说,Surface 就是个自带背景和样式…...
Deepin通过二进制方式升级部署高版本 Docker
一、背景: 在Deepin系统中通过二进制方式升级部署高版本 Docker,下面将详细介绍二进制方式升级部署高版本 Docker 的具体步骤。 二、操作步骤 1.根据需求下载二进制文件,下载地址如下: https://mirrors.tuna.tsinghua.e…...
python中time模块的常用方法及应用
Python 的 time 模块是自带的标准模块,不需要额外安装,可以直接通过import time的方式导入并使用其中的函数和类。该模块提供了与时间相关的各种功能,以下是一些常用方法及其应用场景和示例: ### 1. time.time() - **功能**&…...
【RTSP】客户端(一):RTSP协议实现
概述 RTSP主要功能总结 RTSP本质是一个应用层协议,主要用于控制实时数据的传递,例如音视频流。RTSP的传输方式与HTTP类似,与HTTP不同在于RTSP主要用于控制传输媒体服务器上的流媒体会话。所以其是一个 客户端-服务器模型,客户端需…...
SpringBoot(一)--搭建架构5种方法
目录 一、⭐Idea从spring官网下载打开 2021版本idea 1.打开创建项目 2.修改pom.xml文件里的版本号 2017版本idea 二、从spring官网下载再用idea打开 三、Idea从阿里云的官网下载打开 编辑 四、Maven项目改造成springboot项目 五、从阿里云官网下载再用idea打开 Spri…...
面试之《commonjs,requirejs和es6 Module的区别》
设计理念 CommonJS:是为服务器端环境设计的模块化规范,以同步加载模块为核心思想。服务器端读取文件速度快,同步加载不会造成明显性能问题,方便开发者在代码执行前就确定模块间的依赖关系,便于管理和维护。RequireJS&…...
【工控】线扫相机小结 第五篇
背景介绍 线扫相机通过光栅尺的脉冲触发, 我在调试线扫过程中,发现图像被拉伸,预设调节分配器。图像正常后,我提高的相机的扫描速度(Y轴动的更快了)。 动的更快的发现,图像变短了(以…...
【STM32F103C8T6】DMA数据转运ADC多通道
前言 本节为代码部分,知识点在这【江协科技STM32】DMA直接存储器存储-学习笔记-CSDN博客 查看数据地址: uint8_t aa 0x88;int main(void) {OLED_Init();OLED_ShowHexNum(1,1,aa,4); //显示十六进制数 OLED_ShowHexNum(2,1,(uint32_t)&aa,8);wh…...
[Web]ServletContext域(Application)
简介 Web应用的Application域的实现是通过ServletContext对象实现的。整个Web应用程序的所有资源共享这个域。生命周期与Web应用程序相同,即当前Web应用程序启动时(以服务器视角而非访客视角)出生,Web应用服务程序关闭时停止。 通…...
计算机网络--访问一个网页的全过程
文章目录 访问一个网页的全过程应用层在浏览器输入URL网址http://www.aspxfans.com:8080/news/index.aspboardID5&ID24618&page1#r_70732423通过DNS获取IP地址生成HTTP请求报文应用层最后 传输层传输层处理应用层报文建立TCP连接传输层最后 网络层网络层对TCP报文进行处…...
JVM G1垃圾回收器详细解析
G1内存布局 Garbage First(简称G1)收集器摒弃了传统垃圾收集器的严格的内存划分,而是采用了基于Region的内存布局形式和局部回收的设计思路。 G1垃圾收集器把Java堆划分为2048个大小相等的独立的Region,每个Region大小取值范围为1-32MB,且必…...
OpenGL中绘制图形元素的实现(使用visual studio(C++)绘制一个矩形)
目标:使用OpenGL提供的函数绘制矩形、线段、三角形等基本图形元素 所需效果 实验步骤 1、配置OpenGL(详情参见OpenGL的配置) 2、头文件引入 #include <gl/glut.h> 3、编写方法体 1>矩形实现 //绘制矩形 void DisplayRectangl…...
datax-coud部署
centos7系统环境安装 jdk1.8安装 cd /usr/local 上传jdk文件到/usr/local目录下解压缩 tar -zxvf jdk-8u261-linux-x64.tar.gz# 配置环境变量 vim /etc/profileexport JAVA_HOME=/usr/local/jdk1.8.0_261 export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/lib export PATH=$JAVA_…...
数据库---sqlite3
数据库: 数据库文件与普通文件区别: 1.普通文件对数据管理(增删改查)效率低 2.数据库对数据管理效率高,使用方便 常用数据库: 1.关系型数据库: 将复杂的数据结构简化为二维表格形式 大型:Oracle、DB2 中型:MySql、SQLServer …...
Android StrictMode 使用与原理深度解析
Android StrictMode 是 Android 系统提供的一种开发者工具,用于检测应用主线程中不合理的耗时操作(如磁盘 I/O、网络请求等)和内存泄漏问题。通过配置策略和惩罚机制,它帮助开发者在早期发现潜在性能问题,提升应用流畅…...
js和java中方法重载(js本身是不支持方法重载,方便对比学习)
js如果需要实现方法重载 示例 1:根据参数数量实现重载 function overloadExample() {if (arguments.length 1) {console.log(一个参数:, arguments[0]);} else if (arguments.length 2) {console.log(两个参数:, arguments[0], arguments[1]);} else {console.l…...
代理模式的C++实现示例
核心思想 代理模式(Proxy Pattern)是一种结构型设计模式,其核心思想是为其他对象提供一个代理或占位符,以控制对这个对象的访问。代理对象通常会在客户端和目标对象之间起到中介作用,可以在不改变目标对象的情况下&am…...
【阿里云】控制台使用指南:从创建ECS到系统诊断测评
前言 随着云计算技术的快速发展,越来越多的企业和开发者开始使用云服务来部署和管理应用程序。在众多云服务提供商中,阿里云(Alibaba Cloud)凭借其强大的基础设施和丰富的服务,成为了众多用户的首选。本文旨在介绍如何…...
简易的微信聊天网页版【项目测试报告】
文章目录 一、项目背景二、项目简介登录功能好友列表页面好友会话页面 三、测试工具和环境四、测试计划测试用例部分人工手动测试截图web自动化测试测试用例代码框架配置内容代码文件(Utils.py)登录页面代码文件(WeChatLogin.py)好…...
显示篇(2)- DRM A733 多显主副显绑定
通过hal层根据优先级绑定,优先级越高送显越靠前。(sdk默认mipi优先级最高为主显) 1.双显 如edp主mipi副,edp优先级搞。 更改如下 diff --git a/hwc-hal/drm/drmConnector.cpp b/hwc-hal/drm/drmConnector.cpp --- a/hwc-hal/d…...
基于腾讯云高性能HAI-CPU的跨境电商客服助手全链路解析
跨境电商的背景以及痛点 根据Statista数据,2025年全球跨境电商市场规模预计达6.57万亿美元,年增长率保持在12.5% 。随着平台规则趋严(如亚马逊封店潮),更多卖家选择自建独立站,2024年独立站占比已达35%。A…...
北京迅为RK3568开发板OpenHarmony系统南向驱动开发内核HDF驱动框架架构
瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…...
从0到1入门Docker
一、快速入门 Docker run命令中的常见参数 -d:让容器后台运行--name:给容器命名(唯一)-e:环境变量-p:宿主机端口映射到容器内端口镜像名称结构:Repository :TAG(镜像名&…...
应用篇| 抓包工具-charles的使用
上文说到,我们app爬虫要借助一些抓包工具,本节课就教大家如何使用抓包工具分析app的流量。抓包工具的使用是app爬虫的必修课。相比 Fiddler 来说,Charles 的功能更强大,而且跨平台支持更好。 charles安装 官方网站:https://www.charlesproxy.com 下载链接:Download a F…...
Docker搭建Redis哨兵模式【一主两从三哨兵】
Docker搭建Redis哨兵模式 系统: CentOS 7 Dockder 版本: VMware虚拟机 网络适配器 网络连接 桥接模式:直接连接物理网络查看IP命令 ip addr一、哨兵模式概述 1. 官方文档与关联博客 官方文档:https://redis.io/docs/latest/operate/oss_and_stack/management/sentinel关联博…...
