一句话版本
RSA 把明文 m 变成 memodn,再用 cdmodn 变回来。能变回来,是因为单位群 Zn× 的阶是 φ(n),而任何元素的 φ(n) 次方都等于 1(拉格朗日定理)。
实际实现还会用中国剩余定理把一次模 n 的大运算拆成模 p、模 q 两次小运算,快大约 4 倍。
全文分三层:
- 通俗理解:公钥、私钥、"单向门"
- 实际用处:HTTPS 证书、签名,以及几个经典翻车
- 数学原理:欧拉定理、为什么 ed≡1、CRT 加速,附手算例子
第一层:通俗理解
1.1 一把谁都能锁、只有你能开的挂锁
RSA 的公钥像一把打开着的挂锁:你可以复制几万把发给全世界,任何人都能用它把箱子锁上。但钥匙只有你有,所以锁上的箱子只有你能打开。
| 比喻 |
RSA 里的东西 |
| 打开的挂锁(可以随便发) |
公钥 (n,e) |
| 钥匙(藏好) |
私钥 d |
| 锁箱子 |
加密 c=memodn |
| 开箱子 |
解密 m=cdmodn |
1.2 单向门:乘起来容易,拆开难
RSA 的安全性来自一件很朴素的事:
- 两个 300 位的素数 p,q 乘起来,电脑一眨眼就算完;
- 但给你乘积 n=pq,让你把 p,q 找回来,目前最快的经典算法也要算到天荒地老。
私钥 d 是用 p 和 q 算出来的。外人只知道 n,拆不开 n,就算不出 d。这种"一个方向容易、反方向很难,但有暗门(p,q)就容易"的结构,叫陷门单向函数。
1.3 为什么"乘方再乘方"能回到原点
想象一个钟面,但不是 12 格,而是很多格。你从 m 出发,每次乘以 m 往前走。走了恰好 φ(n) 步之后,一定会回到 1;再多走一步,就回到 m 本身。
RSA 选的 e 和 d 满足 e⋅d=1+kφ(n),所以"先走 e 倍,再走 d 倍"等于绕了 k 整圈再多走一步,刚好回到 m。外人不知道一圈有多长(φ(n)),所以不知道该走多少步回去。
第二层:实际用处
2.1 加密和签名
- 加密:用别人的公钥锁,只有对方能开。实际中 RSA 只用来加密一把随机的 AES 密钥("数字信封"),大数据交给 AES。
- 签名:反过来,用自己的私钥"锁"一份文件的哈希值,所有人都能用公钥打开验证。打得开,就说明一定是私钥持有者签的。
HTTPS 证书、软件更新签名、PGP 邮件、SSH 登录,几十年来大多用 RSA。现在新系统更多换成了椭圆曲线(见《椭圆曲线》),因为同样安全时密钥短得多:
| 安全强度 |
RSA 模数长度 |
椭圆曲线密钥长度 |
| 112 位 |
2048 位 |
224 位 |
| 128 位 |
3072 位 |
256 位 |
| 256 位 |
15360 位 |
512 位 |
2.2 几个经典翻车
| 翻车方式 |
发生了什么 |
| 不加填充 |
教科书式 RSA 是确定性的,同一明文总得到同一密文,小明文空间可以直接穷举。实际必须用 OAEP 填充 |
| Håstad 广播攻击 |
e=3 时把同一条消息发给 3 个人,攻击者用 CRT 把 3 个密文拼成 m3(整数,没有取模),直接开立方根 |
| 共享素因子 |
2012 年研究者扫描全网证书,发现大量设备因随机数太差而共用了某个素数 p。两个 n 求一下 gcd,就同时分解了 |
| ROCA(2017) |
某芯片厂商生成素数的方式有特殊结构,影响了数百万个密钥(其中包括约 75 万张爱沙尼亚身份证),这些密钥可以被分解 |
量子威胁
Shor 算法能在量子计算机上高效分解大整数,RSA 会被彻底攻破,详见《后量子密码》。
第三层:数学原理
3.1 密钥生成
- 选两个大素数 p,q,令 n=pq;
- 计算 φ(n)=(p−1)(q−1),这是 {1,…,n} 中与 n 互素的数的个数;
- 选 e 满足 gcd(e,φ(n))=1(常用 e=65537);
- 用扩展欧几里得算法求 d≡e−1(modφ(n))。
公钥 (n,e),私钥 d。
3.2 欧拉定理:拉格朗日定理的推论
Zn×(模 n 的可逆元)在乘法下是一个有限群,阶为 φ(n)。由拉格朗日定理,每个元素的阶整除群的阶,所以
aφ(n)≡1(modn),gcd(a,n)=1.
这就是欧拉定理;n=p 为素数时它就是费马小定理 ap−1≡1。
3.3 为什么解密正确
由 ed=1+kφ(n),
cd=(me)d=m1+kφ(n)=m⋅(mφ(n))k≡m⋅1k=m(modn).
万一 m 和 n 不互素呢?
这时 m 不在单位群里,欧拉定理不能直接用。但可以分别看模 p 和模 q:比如 p∣m,那么模 p 下两边都是 0;模 q 下用费马小定理照常成立。再由中国剩余定理拼起来,仍有 med≡m(modn)。(实际上这种 m 几乎不可能碰到,碰到了就等于分解了 n。)
3.4 CRT 加速
由中国剩余定理,Zn≅Zp×Zq 是环同构。所以可以把 cdmodn 拆成两半分别算:
mp=cdmod(p−1)modp,mq=cdmod(q−1)modq,
再把 (mp,mq) 拼回模 n 的唯一解。指数可以先模 p−1 缩小,也是费马小定理的功劳。模数位数减半,乘法便宜约 4 倍,指数位数也减半,整体快 3 到 4 倍。
故障攻击
CRT 实现如果在其中一半算错(比如被电压毛刺干扰),错误签名 s′ 满足 s′≡s(modp) 但模 q 不对,于是 gcd(s′e−h, n)=p,一次就分解了 n(Boneh–DeMillo–Lipton 攻击)。所以签名后要先自己验一遍再发出去。
3.5 手算例子
小 RSA
取 p=5,q=11,n=55,φ(n)=40。取 e=3,由 3×27=81≡1(mod40) 得 d=27。
加密 m=7:73=343=6×55+13,所以 c=13。
直接解密:1327mod55=7。
用 CRT 解密:
- 模 5:13≡3,27mod4=3,33=27≡2,所以 m≡2(mod5)
- 模 11:13≡2,27mod10=7,27=128≡7,所以 m≡7(mod11)
- 拼起来:0 到 54 中同时满足 m≡2(mod5)、m≡7(mod11) 的只有 7
两种方法都得到 7。(已用 Python 验算。)
总结
| 层次 |
要点 |
| 直觉 |
乘起来容易、拆开难;知道 p,q 就有暗门 |
| 代数 |
Zn× 的阶是 φ(n),拉格朗日定理给出欧拉定理,ed≡1(modφ(n)) 保证解密正确 |
| 工程 |
CRT 加速 3 到 4 倍;必须填充;签名后要自检 |
| 未来 |
会被 Shor 算法攻破,正在向后量子算法迁移 |