Caloogy 文章
English

RSA 为什么能解密:欧拉定理与中国剩余定理

日期
2025 年 6 月 9 日
系列
密码学
阅读
4 分钟
主题
RSAEuler's theoremLagrangeCRT

一句话版本

RSA 把明文 mm 变成 me mod nm^e \bmod n,再用 cd mod nc^d \bmod n 变回来。能变回来,是因为单位群 Zn×\mathbb{Z}_n^\times 的阶是 φ(n)\varphi(n),而任何元素的 φ(n)\varphi(n) 次方都等于 11(拉格朗日定理)。 实际实现还会用中国剩余定理把一次模 nn 的大运算拆成模 pp、模 qq 两次小运算,快大约 4 倍。

全文分三层:

  1. 通俗理解:公钥、私钥、"单向门"
  2. 实际用处:HTTPS 证书、签名,以及几个经典翻车
  3. 数学原理:欧拉定理、为什么 ed≡1ed \equiv 1、CRT 加速,附手算例子

第一层:通俗理解

1.1 一把谁都能锁、只有你能开的挂锁

RSA 的公钥像一把打开着的挂锁:你可以复制几万把发给全世界,任何人都能用它把箱子锁上。但钥匙只有你有,所以锁上的箱子只有你能打开。

比喻 RSA 里的东西
打开的挂锁(可以随便发) 公钥 (n,e)(n, e)
钥匙(藏好) 私钥 dd
锁箱子 加密 c=me mod nc = m^e \bmod n
开箱子 解密 m=cd mod nm = c^d \bmod n

1.2 单向门:乘起来容易,拆开难

RSA 的安全性来自一件很朴素的事:

私钥 dd 是用 pp 和 qq 算出来的。外人只知道 nn,拆不开 nn,就算不出 dd。这种"一个方向容易、反方向很难,但有暗门(p,qp, q)就容易"的结构,叫陷门单向函数。

1.3 为什么"乘方再乘方"能回到原点

想象一个钟面,但不是 12 格,而是很多格。你从 mm 出发,每次乘以 mm 往前走。走了恰好 φ(n)\varphi(n) 步之后,一定会回到 11;再多走一步,就回到 mm 本身。

RSA 选的 ee 和 dd 满足 e⋅d=1+kφ(n)e \cdot d = 1 + k\varphi(n),所以"先走 ee 倍,再走 dd 倍"等于绕了 kk 整圈再多走一步,刚好回到 mm。外人不知道一圈有多长(φ(n)\varphi(n)),所以不知道该走多少步回去。


第二层:实际用处

2.1 加密和签名

HTTPS 证书、软件更新签名、PGP 邮件、SSH 登录,几十年来大多用 RSA。现在新系统更多换成了椭圆曲线(见《椭圆曲线》),因为同样安全时密钥短得多:

安全强度 RSA 模数长度 椭圆曲线密钥长度
112 位 2048 位 224 位
128 位 3072 位 256 位
256 位 15360 位 512 位

2.2 几个经典翻车

翻车方式 发生了什么
不加填充 教科书式 RSA 是确定性的,同一明文总得到同一密文,小明文空间可以直接穷举。实际必须用 OAEP 填充
Håstad 广播攻击 e=3e = 3 时把同一条消息发给 3 个人,攻击者用 CRT 把 3 个密文拼成 m3m^3(整数,没有取模),直接开立方根
共享素因子 2012 年研究者扫描全网证书,发现大量设备因随机数太差而共用了某个素数 pp。两个 nn 求一下 gcd⁡\gcd,就同时分解了
ROCA(2017) 某芯片厂商生成素数的方式有特殊结构,影响了数百万个密钥(其中包括约 75 万张爱沙尼亚身份证),这些密钥可以被分解

量子威胁

Shor 算法能在量子计算机上高效分解大整数,RSA 会被彻底攻破,详见《后量子密码》。


第三层:数学原理

3.1 密钥生成

  1. 选两个大素数 p,qp, q,令 n=pqn = pq;
  2. 计算 φ(n)=(p−1)(q−1)\varphi(n) = (p-1)(q-1),这是 {1,…,n}\{1, \dots, n\} 中与 nn 互素的数的个数;
  3. 选 ee 满足 gcd⁡(e,φ(n))=1\gcd(e, \varphi(n)) = 1(常用 e=65537e = 65537);
  4. 用扩展欧几里得算法求 d≡e−1(modφ(n))d \equiv e^{-1} \pmod{\varphi(n)}。

公钥 (n,e)(n, e),私钥 dd。

3.2 欧拉定理:拉格朗日定理的推论

Zn×\mathbb{Z}_n^\times(模 nn 的可逆元)在乘法下是一个有限群,阶为 φ(n)\varphi(n)。由拉格朗日定理,每个元素的阶整除群的阶,所以

aφ(n)≡1(modn),gcd⁡(a,n)=1.a^{\varphi(n)} \equiv 1 \pmod n,\qquad \gcd(a, n) = 1.

这就是欧拉定理;n=pn = p 为素数时它就是费马小定理 ap−1≡1a^{p-1} \equiv 1。

3.3 为什么解密正确

由 ed=1+kφ(n)ed = 1 + k\varphi(n),

cd=(me)d=m1+kφ(n)=m⋅(mφ(n))k≡m⋅1k=m(modn).c^d = (m^e)^d = m^{1 + k\varphi(n)} = m \cdot \big(m^{\varphi(n)}\big)^k \equiv m \cdot 1^k = m \pmod n.

万一 mm 和 nn 不互素呢?

这时 mm 不在单位群里,欧拉定理不能直接用。但可以分别看模 pp 和模 qq:比如 p∣mp \mid m,那么模 pp 下两边都是 00;模 qq 下用费马小定理照常成立。再由中国剩余定理拼起来,仍有 med≡m(modn)m^{ed} \equiv m \pmod n。(实际上这种 mm 几乎不可能碰到,碰到了就等于分解了 nn。)

3.4 CRT 加速

由中国剩余定理,Zn≅Zp×Zq\mathbb{Z}_n \cong \mathbb{Z}_p \times \mathbb{Z}_q 是环同构。所以可以把 cd mod nc^d \bmod n 拆成两半分别算:

mp=c d mod (p−1) mod p,mq=c d mod (q−1) mod q,m_p = c^{\,d \bmod (p-1)} \bmod p,\qquad m_q = c^{\,d \bmod (q-1)} \bmod q,

再把 (mp,mq)(m_p, m_q) 拼回模 nn 的唯一解。指数可以先模 p−1p-1 缩小,也是费马小定理的功劳。模数位数减半,乘法便宜约 4 倍,指数位数也减半,整体快 3 到 4 倍。

故障攻击

CRT 实现如果在其中一半算错(比如被电压毛刺干扰),错误签名 s′s' 满足 s′≡s(modp)s' \equiv s \pmod p 但模 qq 不对,于是 gcd⁡(s′e−h, n)=p\gcd(s'^e - h,\ n) = p,一次就分解了 nn(Boneh–DeMillo–Lipton 攻击)。所以签名后要先自己验一遍再发出去。

3.5 手算例子

小 RSA

取 p=5p = 5,q=11q = 11,n=55n = 55,φ(n)=40\varphi(n) = 40。取 e=3e = 3,由 3×27=81≡1(mod40)3 \times 27 = 81 \equiv 1 \pmod{40} 得 d=27d = 27。

加密 m=7m = 7:73=343=6×55+137^3 = 343 = 6 \times 55 + 13,所以 c=13c = 13。

直接解密:1327 mod 55=713^{27} \bmod 55 = 7。

用 CRT 解密:

  • 模 55:13≡313 \equiv 3,27 mod 4=327 \bmod 4 = 3,33=27≡23^3 = 27 \equiv 2,所以 m≡2(mod5)m \equiv 2 \pmod 5
  • 模 1111:13≡213 \equiv 2,27 mod 10=727 \bmod 10 = 7,27=128≡72^7 = 128 \equiv 7,所以 m≡7(mod11)m \equiv 7 \pmod{11}
  • 拼起来:00 到 5454 中同时满足 m≡2(mod5)m \equiv 2 \pmod 5、m≡7(mod11)m \equiv 7 \pmod{11} 的只有 77

两种方法都得到 77。(已用 Python 验算。)


总结

层次 要点
直觉 乘起来容易、拆开难;知道 p,qp, q 就有暗门
代数 Zn×\mathbb{Z}_n^\times 的阶是 φ(n)\varphi(n),拉格朗日定理给出欧拉定理,ed≡1(modφ(n))ed \equiv 1 \pmod{\varphi(n)} 保证解密正确
工程 CRT 加速 3 到 4 倍;必须填充;签名后要自检
未来 会被 Shor 算法攻破,正在向后量子算法迁移