当前位置: 首页 > news >正文

关于 RSA:RSA 加密算法过程

RSA 是一种非对称加密算法,用“公钥”加密,用“私钥”解密,保证数据传输安全。

比喻理解:锁和钥匙

想象一下:

  • 公钥是“上锁的锁”,别人可以用它锁住箱子(加密),但打不开。

  • 私钥是“钥匙”,只有你自己有,可以打开锁(解密)。

所以:

  • 我给你一个“锁”(公钥),你用它锁住一个箱子(加密数据)送回来。

  • 只有我有钥匙(私钥),我能打开箱子(解密数据)。

注意事项

  • 明文必须小于 n,也就是 m<n 否则需分块加密

  • 实际使用中,RSA 通常只加密 对称密钥(比如 AES),而不是大量数据

  • 使用填充算法(如 OAEP)防止加密攻击

第一步:选两个质数

我们先选两个质数(不能被整除的整数):

p = 3
q = 11

第二步:计算 n 和 φ(n)

n = p × q = 3 × 11 = 33
φ(n) = (p - 1) × (q - 1) = 2 × 10 = 20

其中 φ(n) 是一种叫“欧拉函数”的东西,是 RSA 算法的核心之一。

第三步:选一个公钥 e

我们要选一个跟 φ(n) = 20 互质的整数 e,通常选一个小的质数。

e = 7 (因为 7 跟 20 没有公因数,合法)

第四步:求私钥 d(让它能反过来解密)

找一个整数 d,让它满足:

(e × d) % φ(n) = 1
(7 × d) % 20 = 1

试试:

7 × 3 = 21,21 % 20 = 1 

所以:

d = 3

总结密钥对:

公钥 (e, n) = (7, 33)
私钥 (d, n) = (3, 33)

加密过程

假设明文 m = 4,我们用公钥 (7, 33) 加密:

c = m^e % n = 4^7 % 33= 16384 % 33= 16

得到密文:c = 16

解密过程

我们收到密文 16,用私钥 (3, 33) 解密:

m = c^d % n = 16^3 % 33 = 4096 % 33 = 4

恢复出原文:m = 4

欧拉定理

欧拉定理(非常关键)

如果:

  • n 是两个大质数 p * q

  • m n 互质(也就是说 m 不能被 n 的质因子整除)

那么一定成立:m^φ(n) mod n = 1 (其中 φ(n) 是欧拉函数)

φ(n):如果 n 是两个质数 p 和 q 的乘积:n = p * q,那么欧拉函数就是:φ(n)=(p−1)(q−1) ,这表示从 1 到 n−1 里面,有多少个数跟 n 互质。

假设:

  • p=7 ,q=11

  • 那么 n=p ⋅ q=7 * 11 = 77

  • 则:

    φ(77) = (7 − 1)(11 − 1) = 6 * 10 = 60

所以如果 m 与 77 互质,那:m ^ 60 mod  77 = 1

深入理解

我们选 d 的时候,是专门选出来能“抵消” e 的效果的。

所以:

  • 加密是:先做 e 次方

  • 解密是:再做 d 次方

  • e 和 d 是互相“取消”的

就像是这样理解(m是需要用rsa加密的数据)

m^e 再 ^d   就等于 m^(e*d)     而我们生成 d 的时候,保证 e*d 刚好变成 “1 + φ(n) 的倍数”这个时候 m^(e*d) 就刚好又变回 m 本人。

解释:

如果:e * d = 1 mod φ(n)  ⇒  e * d = 1 + k * φ(n)

所以:m ^ (e * d) = m ^ (1+k * φ(n)) = m * ​​​​​​​m ^ (k * φ(n))

然后根据欧拉定理:m ^ φ(n) mod n = 1  ⇒ ​​​​​​​m ^ (k * φ(n)) mod n = 1

所以:m^(e * d) mod n = m mod n =  m 数据被解密(rsa要求被加密的数据满足 m < n)

总结

步骤操作
选质数p = 3, q = 11
计算 nn = 33
计算 φ(n)φ(n) = 20
选公钥 ee = 7
求私钥 dd = 3
加密m = 4c = 16(用公钥)
解密c = 16m = 4(用私钥)
http://www.lqws.cn/news/461107.html

相关文章:

  • C++ map 和 unordered_map 的区别和联系
  • Python Minio库连接和操作Minio数据库
  • math.pow()和pow()的区别
  • Flutter ListTile 深度解析
  • # P7077 [CSP-S2020] 函数调用
  • 地标“金”字招牌再升级:赤水金钗石斛携手世酒中菜开启新纪元
  • OpenStack Dashboard在指定可用域(Availability Zone)、指定节点启动实例
  • 增加定位能力提升图表问答性能,新的图表理解框架-RefChartQA
  • 筑梦岛APP低俗内容事件分析:算法的合规与治理
  • 【国产桌面操作系统开发】设置及屏蔽快捷键(原始文件中设置,绝对生效)
  • python打卡day37
  • 银行账户管理系统-交互系统
  • 考研英语作文评分标准专业批改
  • C++ 学习笔记精要(二)
  • RPC常见问题回答
  • Cargo 与 Rust 项目
  • 让Agent的应用价值增长
  • 实验问题记录:PyTorch Tensor 也会出现 a = b 赋值后,修改 a 会影响 b 的情况
  • 博士,超28岁,出局!
  • 深入解析BERT:语言分类任务的革命性引擎
  • 3D Gaussian Splatting算法安装与实测
  • GO Gin Web框架面试题及参考答案
  • Android sdk 36沉浸式兼容性问题修复
  • 每天一个前端小知识 Day 7 - 现代前端工程化与构建工具体系
  • LeetCode 2942.查找包含给定字符的单词
  • P12894 [蓝桥杯 2025 国 Java B] 智能交通信号灯
  • 伸缩线充电宝推荐丨倍思灵动充45W突破移动界限!
  • 计算机——硬盘驱动器
  • 结构体解决冒泡排序
  • 多线程八股