目录
[1. 概述](#1. 概述)
[2. RSA算法原理](#2. RSA算法原理)
[2.1 密钥生成](#2.1 密钥生成)
[2.2 加密 / 解密过程](#2.2 加密 / 解密过程)
[2.3 签名 / 验签过程](#2.3 签名 / 验签过程)
[3. 为什么e默认选择65537](#3. 为什么e默认选择65537)
[3.1 数学角度:65537 是 费马素数,计算极快](#3.1 数学角度:65537 是 费马素数,计算极快)
[3.2 安全角度:避免"小指数攻击"](#3.2 安全角度:避免“小指数攻击”)
[3.3 被所有加密库标准化支持](#3.3 被所有加密库标准化支持)
[4. 为什么攻击者无法从 e=65537 推出 d?](#4. 为什么攻击者无法从 e=65537 推出 d?)
[4.1 如果攻击者试图逆推出 d,会遇到什么数学难题?](#4.1 如果攻击者试图逆推出 d,会遇到什么数学难题?)
[4.2 那大整数分解到底有多难?](#4.2 那大整数分解到底有多难?)
[4.3 总结](#4.3 总结)
1. 概述
RSA是1977年Ron Rivest、Adi Shamir和Leonard Adleman一起提出的。RSA就是他们三人姓氏开头字母拼在一起组成的。
RSA算法的核心思想是利用一对密钥(公钥和私钥)进行加密和解密操作。公钥可以公开分发给任何人,用于加密信息,而私钥则必须保密,用于解密信息。这种加密方式保证了只有私钥的持有者才能解密出原始信息,从而确保了信息传输的安全性。
目前有RSA 1024,2048,4096,它们都属于 同一个 RSA 算法 ,唯一的区别是 密钥长度。
| 名称 | 密钥长度 | p 和 q 的长度(大致) |
|---|---|---|
| RSA‑1024 | 1024 bit | 512 bit ×2 |
| RSA‑2048 | 2048 bit | 1024 bit ×2 |
| RSA‑4096 | 4096 bit | 2048 bit ×2 |
数学原理 完全一样,只是数字更大,更难分解。
- RSA‑1024 已经被攻破,不安全,禁止使用(TLS、证书都不再允许)
- RSA‑2048 目前是互联网主流安全强度
- RSA‑4096 则面向高安全应用(银行、政府、长期签名)
2. RSA算法原理
2.1 密钥生成
- 选择两个大质数
p 和 q(2048 位 RSA 通常让 n=pq 长度为 2048 bit)
- 计算
ϕ(n)=(p−1)(q−1)
- 选择一个与 ϕ(n) 互素的整数e
满足 1 < e < φ(n) 且 e 与 φ(n) 互质,通常取 65537=2^16+1)
因为计算快、且安全
- 计算私钥指数d
ed≡1(modϕ(n))
也就是:d 是 e 关于模 φ(n) 的 " 逆元 "
数学名称:模乘法逆元(modular multiplicative inverse)
最终得到:
- 公钥:(n,e)
- 私钥:(n,d)
2.2 加密 / 解密过程
- 加密(公钥加密):明文 m → 密文 c = m^e mod n(m 必须小于 n,否则需分段)。
- 解密(私钥解密):密文 c → 明文 m = c^d mod n。
2.3 签名 / 验签过程
签名(私钥签名):
-
对数据 data 计算哈希值 hash(data)
-
用私钥加密哈希值得到签名 sig = hash(data)^d mod n。
验签(公钥验签):
-
接收方用公钥解密签名 hash'(data) = sig^e mod n
-
对比 hash'(data) 与自身计算的 hash(data),一致则数据未篡改且身份合法。
3. 为什么e默认选择65537
为什么 RSA 默认选择 e = 65537?为什么不是 3、17、239、随机数......?
从数学、工程、安全三个角度看,65537 是几乎完美的公钥指数,成为事实标准。
下面分步骤讲清楚
3.1 数学角度:65537 是 费马素数,计算极快
65537 = 2¹⁶ + 1,是一个 费马素数(Fermat prime)。
它的二进制非常稀疏:
1_0000_0000_0000_0001
只有 两个 1,这意味着:
模幂运算 m^e mod n 的复杂度极低
因为"平方‑乘法"(Square‑and‑Multiply)实现时,"乘法次数"特别少,速度快。
比方说:
- e = 65537:只需 17 次乘法
- e = 3:只需 2 次乘法(但不安全)
- e = 随机 2048 位数:需要上千次乘法(很慢)
所以 65537 是在 计算速度和安全性之间的最佳点。
3.2 安全角度:避免"小指数攻击"
e = 3、e = 17 曾经被广泛使用
但是导致多个严重安全问题:
- 低加密指数攻击(Low Exponent Attack)
如果加密消息 没有足够 padding,可能出现:
c=m3<nc = m^3 < nc=m3<n
攻击者可直接开立方根恢复明文。
- 广播攻击(Håstad Attack)
多个用户都用 e=3 时,攻击者能组合多个密文直接解密。
- Coppersmith 攻击
数字结构不够随机时,小 e 会暴露弱点。
因此,小指数(3、5、7、17)如今已全部不安全。
而:
✔ e=65537 足够大,能避免以上所有攻击
同时又不会过大导致性能下降。
所以它成为行业标准。
3.3 被所有加密库标准化支持
包括:
- OpenSSL
- Windows CNG
- Java's RSA
- Python cryptography
- PKCS#1 标准
- x.509 证书体系
4. 为什么攻击者无法从 e=65537 推出 d?
生成 d 的公式是:
d=e^mod ϕ(n)
要算 d 中的逆元,必须要知道:
ϕ(n)=(p−1)(q−1)
但 ϕ(n) 的计算前提是:
必须知道 p 和 q。
而外界只能看到 公钥 n ,但不知道它的质因子 p、q。
⭐ 換句话说:
只要不知道 p、q,就无法算 ϕ**(n),
而没有** ϕ**(n),就永远无法逆推出 d。**
4.1 如果攻击者试图逆推出 d,会遇到什么数学难题?
攻击者已知:
- n=pq
- e=65537
攻击者想求 d,但是公式依赖 ϕ(n):
ϕ(n)=(p−1)(q−1)
所以攻击者必须:
💥 把 n 分解为 p 和 q
这就是 RSA 安全性的核心:
公钥 n 是一个约 2048/4096 位的大整数,它是两个超大质数的乘积。对 n 因式分解是超难问题。
4.2 那大整数分解到底有多难?
目前已知最快的算法(GNFS)在现实中:
✔ 从未分解成功 2048-bit RSA
✔ 甚至 1024-bit 都只有在国家级资源下才有可能
✔ 2048-bit 需要的计算量接近天文数字
这就是为什么 2048-bit RSA 仍然安全。
4.3 总结
| 项目 | 是否公开 | 是否影响安全性 |
|---|---|---|
| e=65537 | ✔ 公开 | ✔ 无风险 |
| n | ✔ 公开 | ✔ 无风险 |
| d | ❌ 不公开 | ✔ 核心秘密 |
| p, q | ❌ 不公开 | ✔ 核心秘密 |
| φ(n) | ❌ 不公开 | ✔ 关键,不可推算 |