Back to notebook

公钥密码体制:数论基础与 RSA 算法全流程

This post is not yet available in English. Showing the original version.
Table of Contents
Table of Contents

公钥密码学(非对称密码体制)通过引入单向陷门函数,彻底解决了对称密码体制在大型网络中密钥分发与管理的固有瓶颈。本篇系统阐明支持公钥密码的核心数论工具(辗转相除法、扩展欧几里得算法、欧拉定理、快速模幂),深入推导 RSA 算法的数学原理、加解密流程、全域正确性证明,以及工程实现中的双模数规范与安全填充要求。


一、非对称密码体制的提出背景与密钥分配问题

在对称密码体制中,任何一对想要进行保密通信的实体必须预先共享同一个秘密密钥。

1976 年,Diffie 与 Hellman 提出了公钥密码体制的思想:

公钥密码的数学基础是单向陷门函数(Trapdoor One-Way Function):正向计算在多项式时间内易于完成;在未知陷门(私钥)时,反向求解在计算复杂度上不可行;但一旦掌握特定陷门信息,反向求解同样可在多项式时间内高效完成。


二、欧几里得算法(辗转相除法)代数原理

整数除法基本定理指出:对于任意整数 a,ba, b(设 b>0b > 0),存在唯一的整数商 qq 与余数 rr,满足:

a=q⋅b+r,0≤r<b.a = q \cdot b + r,\qquad 0 \le r < b.

2.1 最大公约数的传递不变性

代数整除性质保证:任何同时整除 aa 与 bb 的公约数,必能整除二者的线性组合 r=a−qbr = a - qb;反之,任何同时整除 bb 与 rr 的公约数,亦必能整除 a=qb+ra = qb + r。因此,aa 与 bb 的公约数集合同 bb 与 rr 的公约数集合完全相同,其最大公约数(Greatest Common Divisor)恒等:

gcd⁡(a,b)=gcd⁡(b,r)=gcd⁡(b, a mod b).\gcd(a, b) = \gcd(b, r) = \gcd(b,\ a \bmod b).

通过不断以除数除以余数,余数序列严格单调递减(b>r1>r2>⋯≥0b > r_1 > r_2 > \cdots \ge 0),必然在有限步内收敛终止于余数为 0。最后一个非零余数即为最大公约数 gcd⁡(a,b)\gcd(a, b)。

算例:计算 gcd⁡(7469,2464)\gcd(7469, 2464):

  1. 7469=3×2464+777469 = 3 \times 2464 + 77;
  2. 2464=32×77+02464 = 32 \times 77 + 0。
    最后一个非零余数为 77,故 gcd⁡(7469,2464)=77\gcd(7469, 2464) = 77。

三、扩展欧几里得算法(EEA)与模逆求解

裴蜀定理(Bézout's Identity)指出:对任意整数 a,ba, b,恒存在整数系数 s,ts, t,满足线性丢番图方程:

s⋅a+t⋅b=gcd⁡(a,b).s \cdot a + t \cdot b = \gcd(a, b).

扩展欧几里得算法(Extended Euclidean Algorithm, EEA)在执行辗转相除的同时,通过反向代换求出这组整数解 (s,t)(s, t)。

3.1 求解模逆元的判定依据

当且仅当 gcd⁡(a,n)=1\gcd(a, n) = 1 时,裴蜀等式为:
s⋅a+t⋅n=1.s \cdot a + t \cdot n = 1.
等式两端在模 nn 意义下展开:
s⋅a+t⋅n≡s⋅a+0≡1(modn)  ⟹  a−1≡s(modn).s \cdot a + t \cdot n \equiv s \cdot a + 0 \equiv 1 \pmod n \implies a^{-1} \equiv s \pmod n.
系数 ss 即为 aa 模 nn 的乘法逆元。若算得的系数 ss 为负数,通过加上模数 nn 调整为最小正剩余:snorm=(s mod n+n) mod ns_{\text{norm}} = (s \bmod n + n) \bmod n。

3.2 扩展欧几里得算法手算实例

例题:求解 49−1(mod640)49^{-1} \pmod{640}。

  1. 第一阶段:前向辗转相除(记录除法整商):
    • 640=13×49+3640 = 13 \times 49 + 3
    • 49=16×3+149 = 16 \times 3 + 1
    • 3=3×1+03 = 3 \times 1 + 0(最后一个非零余数为 1,确证互素,逆元存在)。
  2. 第二阶段:反向线性组合回代:
    从倒数第二个等式中将余数 1 隔离出来:
    1=49−16×3.1 = 49 - 16 \times 3.
    将第一式中的余数 3=640−13×493 = 640 - 13 \times 49 代入替换:
    1=49−16×(640−13×49)=49−16×640+208×49=209×49−16×640.1 = 49 - 16 \times (640 - 13 \times 49) = 49 - 16 \times 640 + 208 \times 49 = 209 \times 49 - 16 \times 640.
  3. 第三阶段:提取逆元系数并取模:
    209×49≡1(mod640)  ⟹  49−1≡209(mod640).209 \times 49 \equiv 1 \pmod{640} \implies 49^{-1} \equiv 209 \pmod{640}.
  4. 乘回自检:
    49×209=10241=16×640+1≡1(mod640).49 \times 209 = 10241 = 16 \times 640 + 1 \equiv 1 \pmod{640}.
    验算无误。

四、欧拉函数 φ(n)\varphi(n) 与欧拉定理

4.1 欧拉函数定义与性质

欧拉函数 φ(n)\varphi(n)(Euler's Totient Function)定义为小于或等于 nn 的正整数中与 nn 互素的整数个数:

φ(n)=∣{k∈N∣1≤k≤n, gcd⁡(k,n)=1}∣.\varphi(n) = \big|\{ k \in \mathbb{N} \mid 1 \le k \le n,\ \gcd(k, n) = 1 \}\big|.

核心性质:

  1. 若 pp 为素数,因 11 到 p−1p-1 均与 pp 互素,故:
    φ(p)=p−1.\varphi(p) = p - 1.
  2. 欧拉函数为积性函数:若 gcd⁡(a,b)=1\gcd(a, b) = 1,则 φ(ab)=φ(a)φ(b)\varphi(ab) = \varphi(a)\varphi(b)。
  3. RSA 模数特例:对于合数 n=pqn = pq(其中 p,qp, q 为互异奇素数):
    φ(n)=(p−1)(q−1).\varphi(n) = (p - 1)(q - 1).
    容斥原理证明:在集合 {1,2,…,pq}\{1, 2, \dots, pq\} 中,pp 的倍数有 qq 个(p,2p,…,qpp, 2p, \dots, qp),qq 的倍数有 pp 个(q,2q,…,pqq, 2q, \dots, pq),公倍数 pqpq 被多扣除了一次。因此与 nn 互素的元素总数为:
    φ(pq)=pq−q−p+1=(p−1)(q−1).\varphi(pq) = pq - q - p + 1 = (p - 1)(q - 1).

4.2 欧拉定理与费马小定理

欧拉定理(Euler's Theorem):
若整数 aa 与模数 nn 互素(即 gcd⁡(a,n)=1\gcd(a, n) = 1),则:

aφ(n)≡1(modn).a^{\varphi(n)} \equiv 1 \pmod n.

费马小定理(Fermat's Little Theorem):
当模数退化为素数 pp 时,φ(p)=p−1\varphi(p) = p - 1。对任意不能被 pp 整除的整数 aa(p∤ap \nmid a):

ap−1≡1(modp).a^{p - 1} \equiv 1 \pmod p.

指数同余降幂准则:
若 gcd⁡(a,n)=1\gcd(a, n) = 1,在计算 ak mod na^k \bmod n 时,指数 kk 可以直接在模 φ(n)\varphi(n) 的意义下进行约简:
ak≡ak mod φ(n)(modn).a^k \equiv a^{k \bmod \varphi(n)} \pmod n.


五、模幂快速计算:平方-乘算法(Square-and-Multiply)

在密码学中,加解密涉及计算 xe mod nx^e \bmod n,其中底数、指数与模数通常长达数千比特。若直接计算 xex^e,中间数值将导致计算机内存溢出。
平方-乘算法(快速幂)利用指数 ee 的二进制表示,将模乘法次数从 O(e)O(e) 指数级压缩至 O(log⁡2e)O(\log_2 e) 对数级。

设指数 ee 的二进制展开式为:
e=(1bt−1bt−2⋯b1b0)2.e = (1 b_{t-1} b_{t-2} \cdots b_1 b_0)_2.

5.1 自高位向低位(MSB to LSB)标准执行流程

  1. 初始化累加器为 R=x mod nR = x \bmod n(对应最高有效位 1);
  2. 从次高位 bt−1b_{t-1} 开始向低位依次扫描每一个比特位 bib_i(从 bt−1b_{t-1} 至 b0b_0):
    • 每一步必执行模平方:R←(R⋅R) mod nR \leftarrow (R \cdot R) \bmod n(数学含义:指数值翻倍,对应二进制向左逻辑移位追加 0);
    • 若当前比特 bi=1b_i = 1,追加一次模乘底数:R←(R⋅x) mod nR \leftarrow (R \cdot x) \bmod n(数学含义:指数值加 1,将二进制末位的 0 置换为 1)。
  3. 循环结束,输出最终结果 RR。
二进制比特 bib_i算术操作指数演变物理含义
任意比特必执行一次平方R←R2 mod nR \leftarrow R^2 \bmod n(指数翻倍)
仅当 bi=1b_i = 1追加一次乘基数R←R⋅x mod nR \leftarrow R \cdot x \bmod n(指数自增 1)
def square_and_multiply(x, e, n):
    r = 1
    x = x % n
    for bit in bin(e)[2:]: # 从最高有效位向低位迭代
        r = (r * r) % n
        if bit == '1':
            r = (r * x) % n
    return r

手算实例:计算 x13 mod nx^{13} \bmod n。
指数 13=(1101)213 = (1101)_2:


六、RSA 算法全生命周期流程与双模数规范

6.1 算法流程五步法

flowchart TD
    S1["1. 选取两个独立大素数 p, q (保密)"] --> S2["2. 计算模数 n = p * q (公开)"]
    S2 --> S3["3. 计算欧拉函数 φ(n) = (p-1)*(q-1) (保密)"]
    S3 --> S4["4. 选取公钥指数 e,满足 gcd(e, φ(n)) = 1 (公开)"]
    S4 --> S5["5. 用 EEA 求解私钥指数 d ≡ e^(-1) (mod φ(n)) (严格保密)"]
  1. 密钥生成:
    • 选取两个独立的大素数 p,qp, q;
    • 计算公开模数 n=pqn = pq;
    • 计算保密的欧拉函数值 φ(n)=(p−1)(q−1)\varphi(n) = (p - 1)(q - 1);
    • 选取公开加密指数 ee,满足 1<e<φ(n)1 < e < \varphi(n) 且满足互素条件:gcd⁡(e,φ(n))=1\gcd(e, \varphi(n)) = 1(工程中通常选用费马素数 e=65537=216+1e = 65537 = 2^{16} + 1,因其二进制仅有两位为 1,能极快加速平方-乘算法);
    • 计算私钥解密指数 dd,满足:
      d≡e−1(modφ(n)),1<d<φ(n);d \equiv e^{-1} \pmod{\varphi(n)},\qquad 1 < d < \varphi(n);
    • 公钥元组发布为 (n,e)(n, e),私钥元组严格保密为 (d)(d)。
  2. 加密过程:
    将明文编码为整数 x∈{0,1,…,n−1}x \in \{0, 1, \dots, n-1\},计算密文:
    y=xe mod n.y = x^e \bmod n.
  3. 解密过程:
    接收密文 y∈{0,1,…,n−1}y \in \{0, 1, \dots, n-1\},恢复明文:
    x=yd mod n.x = y^d \bmod n.

[!IMPORTANT]
双模数严格区分规范(考试极高频失分点):

  • 在指数层面(密钥生成、求模逆 dd、指数约简降幂):必须使用保密的欧拉函数值 φ(n)\varphi(n) 作为模数;
  • 在数据层面(明文、密文、实际加解密多项式求模):必须使用公开的模数 nn 作为模数。
    混淆两者将导致计算推导彻底失真。

6.2 完整教学算例推导

参数设定:选取素数 p=5,q=11p = 5, q = 11。

  1. 计算模数:n=5×11=55n = 5 \times 11 = 55;
  2. 计算欧拉函数:φ(n)=(5−1)(11−1)=4×10=40\varphi(n) = (5 - 1)(11 - 1) = 4 \times 10 = 40;
  3. 选取公钥指数:选 e=3e = 3,核查 gcd⁡(3,40)=1\gcd(3, 40) = 1 合法;
  4. 计算私钥 dd:由 3d≡1(mod40)3d \equiv 1 \pmod{40},因 3×27=81=2×40+13 \times 27 = 81 = 2 \times 40 + 1,解得 d=27d = 27;
  5. 加密明文 x=9x = 9:
    y=93 mod 55=729 mod 55=14;y = 9^3 \bmod 55 = 729 \bmod 55 = 14;
  6. 解密密文 y=14y = 14:
    x′=1427 mod 55.x' = 14^{27} \bmod 55.
    利用平方-乘展开算得 1427≡9(mod55)14^{27} \equiv 9 \pmod{55},精确还原明文 x=9x = 9。

七、RSA 算法全域正确性证明:基于中国剩余定理(CRT)

目标:证明对任意整数 x∈Znx \in \mathbb{Z}_n,恒有 xed≡x(modn)x^{ed} \equiv x \pmod n。

根据私钥构造,e⋅d≡1(modφ(n))e \cdot d \equiv 1 \pmod{\varphi(n)},即存在非负整数 kk 使得:
ed=1+k⋅φ(n)=1+k(p−1)(q−1).ed = 1 + k \cdot \varphi(n) = 1 + k(p - 1)(q - 1).

若明文 xx 与模数互素(gcd⁡(x,n)=1\gcd(x, n) = 1),根据欧拉定理,xφ(n)≡1(modn)x^{\varphi(n)} \equiv 1 \pmod n,直接得出:
xed=x1+kφ(n)=x⋅(xφ(n))k≡x⋅1k≡x(modn).x^{ed} = x^{1 + k\varphi(n)} = x \cdot (x^{\varphi(n)})^k \equiv x \cdot 1^k \equiv x \pmod n.

然而,在合法消息空间 Zn\mathbb{Z}_n 中,存在少数与 nn 不互素的元素(即 xx 为 pp 或 qq 的倍数)。为给出无漏洞的完备证明,需引入中国剩余定理(CRT)在模 pp 与模 qq 下分别讨论:

  1. 考查模 pp:
    • 情况 A:若 x≡0(modp)x \equiv 0 \pmod p(即 p∣xp \mid x),显然 xed≡0ed≡0≡x(modp)x^{ed} \equiv 0^{ed} \equiv 0 \equiv x \pmod p;
    • 情况 B:若 x≢0(modp)x \not\equiv 0 \pmod p(即 p∤xp \nmid x),由费马小定理得 xp−1≡1(modp)x^{p-1} \equiv 1 \pmod p。代入得:
      xed=x⋅(xp−1)k(q−1)≡x⋅(1)k(q−1)≡x(modp).x^{ed} = x \cdot \big(x^{p-1}\big)^{k(q-1)} \equiv x \cdot (1)^{k(q-1)} \equiv x \pmod p.
      无论何种情形,同余式 xed≡x(modp)x^{ed} \equiv x \pmod p 恒成立,即 p∣(xed−x)p \mid (x^{ed} - x)。
  2. 考查模 qq:
    完全同理对称可证:q∣(xed−x)q \mid (x^{ed} - x)。
  3. 模数合成:
    因为 pp 与 qq 为互异素数,二者的最小公倍数为 lcm⁡(p,q)=pq=n\operatorname{lcm}(p, q) = pq = n。根据代数整除性质:若两个互素数同时整除同一个数,则二者的乘积亦必整除该数:
    n∣(xed−x)  ⟺  xed≡x(modn).n \mid (x^{ed} - x) \iff x^{ed} \equiv x \pmod n.

证毕。该证明在数学上确证了:对于整个消息集合中的任意整数 x∈Znx \in \mathbb{Z}_n,RSA 解密算法均能精确恢复原文。


八、大整数质因数分解的难解性与小模数试除攻击

从密文 y≡xe(modn)y \equiv x^e \pmod n 求解明文 xx,本质是求解同余高次多项式的离散模根:

xe−y≡0(modn).x^e - y \equiv 0 \pmod n.

在实数域中开方可通过数值逼近求解;而在离散模代数中,只要合数模数 nn 的因数分解未公开,求解合数模下的离散 ee 次根在计算复杂度上等价于大整数质因数分解。

小模数攻击范例:
设截获公钥 n=2623,e=211n = 2623, e = 211,密文 y=1141y = 1141:

  1. 攻击者对较小模数 n=2623n=2623 进行试除,在 2623≈51.2\sqrt{2623} \approx 51.2 范围内搜索素数,快速分解出 2623=43×612623 = 43 \times 61;
  2. 获知因数后,立即恢复出保密的欧拉函数值:φ(n)=(43−1)(61−1)=42×60=2520\varphi(n) = (43 - 1)(61 - 1) = 42 \times 60 = 2520;
  3. 利用扩展欧几里得算法求解模逆:d≡211−1(mod2520)  ⟹  d=1051d \equiv 211^{-1} \pmod{2520} \implies d = 1051;
  4. 计算快速模幂:x=11411051 mod 2623=1055x = 1141^{1051} \bmod 2623 = 1055,非法解密成功。

在工程实践中,为保证抗攻击强度,pp 与 qq 必须为长度至少为 1024 比特(模数 nn 至少 2048 至 4096 比特)的强伪随机素数,使得目前最顶尖的数域筛法(GNFS)在计算上完全不可行。


九、教科书 RSA 的固有缺陷与工程填充方案(RSA-OAEP)

未经填充的纯数学 RSA(Textbook RSA)在工程落地中被严格禁止直接使用,其主要存在两大结构缺陷:

  1. 确定性加密缺陷:
    相同公钥对相同明文的加密输出绝对唯一。若候选明文空间极小(例如消息仅为“买入”或“卖出”),攻击者可预先通过公钥加密所有候选明文,建立彩虹字典直接匹配密文,机密性荡然无存。
  2. 可延展性与乘法同态(Multiplicative Homomorphism):
    E(x1)⋅E(x2)=(x1e mod n)(x2e mod n)≡(x1x2)e≡E(x1x2)(modn).E(x_1) \cdot E(x_2) = (x_1^e \bmod n)(x_2^e \bmod n) \equiv (x_1 x_2)^e \equiv E(x_1 x_2) \pmod n.
    攻击者即使无法解密密文,也能通过篡改密文注入特定乘法因子,导致接收方解密出被操控的业务数据。

工程解决方案:
现代安全协议(如 TLS)必须采用最优非对称加密填充(RSA-OAEP, Optimal Asymmetric Encryption Padding):



0 / 2000
Loading comments...