从 01 开始 从 01 开始
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • RSS
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 📖 读书

    • 读书工具
    • 读书笔记
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • RSS
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 📖 读书

    • 读书工具
    • 读书笔记
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档
  • JavaSE

    • 我的 Java 学习路线
    • 安装 Java
    • Java数据类型

    • Java 多版本配置
    • 面向对象

    • Java核心类

    • IO

    • Java与时间

    • 异常处理

    • 哈希和加密算法

      • 什么是哈希算法
      • 第三方库的哈希算法
      • MAC 算法
      • 加密算法介绍
      • 对称加密算法
      • 口令加密算法
      • 非对称加密算法介绍
      • RSA 算法原理(一):数学知识
      • RSA算法原理(二):概述
        • RSA 算法的加密过程
        • 私钥解密的证明
        • RSA 算法的可靠性
        • RSA 算法的优缺点
        • 总结
      • RSA 算法原理(三):补充知识
      • Java 中的 RSA 算法
      • DH 算法
      • 数字签名
      • SSL 和 TLS 协议介绍
    • Java8新特性

    • 网络编程

  • JavaSenior

  • JavaEE

  • JavaWeb

  • Spring

  • 主流框架

  • SpringMVC

  • SpringBoot

  • Java
  • JavaSE
  • 哈希和加密算法
2023-03-20
目录

RSA算法原理(二):概述

# RSA算法原理(二):概述

经过上一篇的讲解,相信大家已经与了一定的数学基础,可以开始理解 RSA 算法的原理了。本文重点是介绍 RSA 的原理,尽量让初学者也能理解,并不会做太多高深的数学探讨,太复杂的的数学证明也不会详述,并不会特别严谨(因为笔者也不是专业的数学家 😅)

我们先从 RSA 算法的加密过程说起,然后说下 RSA 算法的原理,最后说下 RSA 的可靠性和优缺点。

在下一篇中,我们还会补充讲解关于 RSA 算法的更多知识。

# RSA 算法的加密过程

我们假设 Bob 要和 Alice 发消息,要发送的数据是 m (message 的意思)。

为此,Alice 要先计算出公私玥,然后公开公钥,这样 Bob 才能用公钥来加密,Alice 收到后用私钥进行解密。

# 公私玥的生成

这里说下公私钥是怎么生成的

  1. 首先,Alice 选择一对不相等且足够大的质数,记为 p 和 q
  2. 计算 pq 的乘积,记为 n,也就是 p × q = n
  3. 计算 n 的欧拉函数,φ(n) = φ(p×q) = φ(p) × φ(q) = (p -1 ) × (q - 1)
  4. 随机选取一个与 φ(n) 互质的数 e,并且 1 < e < φ(n)
  5. 计算出一个 e 对于 φ(n)的模反元素 d,也就是说 ed mod φ(n) = 1

至此,公私玥都已经生成了。n 和 e 就是公钥,d 和 n 就是私钥。关于 p 和 q 我们可以不要了。

# 加密数据

有了公玥,就可以对数据进行加密了。

第一步,选取要加密的数据。这里假设明文是 m ,这里先声明下,m 必须是整数(字符串可以取 ascii 值或 unicode 值),且 m 必须小于 n。如果要加密大于 n 的整数,该怎么办?有两种解决方法:

  • 一种是把长信息分割成若干段短消息,每段分别加密;
  • 另一种是先选择一种"对称性加密算法",用这种算法的密钥加密信息(例如 AES),再用 RSA 公钥加密 AES 密钥。

第二步,我们求 m 的 e 次幂(e 指 encrypt,可以理解为是密钥),得到 me。

第三步,然后我们将结果对 N 取模, 最后得到的就是密文,设为 c(cipher,密钥):me mod n = c

至此,加密就完成了。之前我们讲过取模运算是不可逆的,所以加密后的 c 是很难反推出原本的明文 m。

小结:加密公式为 me mod n = c

# 解密数据

Alice 收到密文后,如何解密呢?使用这个解密公式:cd mod n = m,这样就能得到明文了。接下来会给出为什么这样就能解密出来的证明。

# 私钥解密的证明

# 公式变换

接下来我们一步步证明解密规则怎么成立: cd mod n = m

首先,密文 c 是是通过 m 的 e 次幂然后对 N 取模得到的,me mod n = c ,代入上式

可得 cd mod n = (me mod n )d mod n

而根据取模运算的运算规律: (ab) mod p = ((a mod p)b) mod p

可得:(me mod n )d mod n = med mod n

而我们说过,d 是 e 对于 φ(n) 的模反元素,也就是说 ed mod φ(n) = 1,因此存在一个整数 k,使得 ed = kφ(n) + 1,这样 ed mod φ(n) = (kφ(n) + 1) mod φ(n) = 1。

因此 med mod n 可以写成: mkφ(n)+1 mod n,我们要证明 mkφ(n)+1 mod n = m

注:上式也可以转为:(mkφ(n) × m) mod n = (mkφ(n) mod n * m mod n ) = m

接下来,分成两种情况证明上面这个式子。

(1) m 与 n 互质

(2) m 与 n 不互质

# m 与 n 互质

还是根据模的运算规律:(ab) mod p = ((a mod p)b) mod p

因此,mkφ(n) mod n = (mφ(n) mod n)k mod n,根据欧拉定理, mφ(n) mod n = 1,1 的 k 次方 mod n,还是等于 1.

因此,(mkφ(n) mod n * m mod n ) = 1 * m mod n = m mod n

最后我们可以得到,m mod n = m 。

为什么 m mod n = m? 因为 m 对 n 取模就是 m ÷ n,而 m < n,因此商为 0,余数为 m。

# m 与 n 不互质

由于 n 等于质数 p 和 q 的乘积,而 m 与 n 不互质,因此得有一个公因数,n 的因数只有 p 和 q, 所以 m 必然等于 kp 或 kq (k 是整数)

以 m = tp 为例(t 为另一个正整数,即使 m=tq,也是一样的证明方式),则 t 与 q 必然互质,并且由于 p,q 是素数,tp(也就是 m)与 q 也是互质的。

如果 t 与 q 不互质,因为 q 是质数,所以 t 只能是 q 的倍数,假设 t = aq,那么 m =tp = aqq = an > n,但我们前面说过,m < n。所以 t 与 q 互质。

因此根据欧拉定理,这个式子是成立的 :(tp)φ(q) = mφ(q) ≡ 1 (mod q)

我们两边同时取 kφ(p) 次幂,并根据模运算规律:(ab) mod p = ((a mod p)b) mod p

可得 (mφ(q))kφ(p) mod q = ( (mφ(q) mod q )φ(p)) mod p = 1φ(p) mod p = 1

因此,mφ(q)kφ(p) mod p = 1

而 φ(p) * φ(q) = φ(n), 因此,mkφ(n) ≡1 ( mod q ),

也就是 mkφ(n) mod q = 1,或者说 mkφ(n) ÷ q 的余数为 1。那么假设商就是 r,则有 mkφ(n) = rq+1 ,

那么,两边同时乘以 m,则由 m × mkφ(n) = m(rq+1) ,=tp(1+rq) = tp + tprq = m + trn,

如果我们让 (m + trn) ÷ n,可以得到商为 tr,余数为 m

那么,也就是 m × mkφ(n) mod n= m,也就是 mkφ(n)+1 mod n= m,因此,原式得证。

# RSA 算法的可靠性

n 和 e 就是公钥,d 和 n 就是私钥,有没可能通过公钥推导出私钥(推导出 d)?

  1. ed mod φ(n) ≡1 。只有知道 e 和 φ(n),才能算出 d。
  2. 而 φ(n)= (p-1) (q-1)。只有知道 p 和 q,才能算出 φ(n)。
  3. 而 n=pq。只有将 n 因数分解,才能算出 p 和 q。

结论:如果 n 可以被因数分解,d 就可以算出,也就意味着私钥被破解。

可是,大整数的因数分解,是一件非常困难的事情。目前,除了暴力破解,还没有发现别的有效方法。

# RSA 算法的优缺点

优点:一是安全,即使别人拿到了公钥和密文,也无法解密。二是方便了密钥的管理。公钥是公开的,可以随便发布

缺点:RSA 公钥密码系统存在的主要缺陷是:加密操作和解密操作都涉及到复杂的指数运算,处理速度很慢,较对称密码算法慢几个数量级。与典型的对称加密算法(例如 DES)相比,即使在最理想的情况下,RSA 也要比 DES 慢上 100 倍。

因此,使用 RSA 只能加密少量数据,大量的数据加密还要靠对称密码算法。实际应用中一般用来加密对称算法的密钥,而密文多用对称加密算法加密传输。

举个例子:服务端生成一个非对称加密的密钥对,私钥自己保存,公钥发送给客户端,客户端拿到这个公钥之后,再生成一个对称加密的密钥,然后把对称加密的密钥通过公钥进行加密,加密之后发送给服务端,服务端通过私钥进行解密,这样客户端和服务端就可以通过对称加密进行通信了。

# 总结

严谨的证明过程不必细致追究,主要是搞清楚 RSA 算法是如何加密和解密的,底层的数学原理是什么。个人建议只要对这些原理性的东西知道个大概就可以了。如果想深入理解需要很强的数学功底,做工程的实在是没必要。

关于加密规则和解密规则是怎么想出来的,这里笔者也不知道,只能说大神是存在的 😄😄😄,而且这也不是本文的重点,欢迎读者留言补充

静下心来,每一步都是我们之前讲过的知识,可能看一次两次看不懂,看多几次总可以的。目前网上的说明基本上我都看不懂,因此自己仔细钻研了 5 天,才略有所得,特地将心得分享出来,希望能帮到读者们。

上次更新: 2024/10/1 17:03:07
RSA 算法原理(一):数学知识
RSA 算法原理(三):补充知识

← RSA 算法原理(一):数学知识 RSA 算法原理(三):补充知识→

最近更新
01
吐槽一下《僵尸校园》
05-15
02
2025 年 4 月记
04-30
03
山西大同 “订婚强奸案” 将会给整个社会带来的影响有多严重? - 知乎 转载
04-26
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式