Archipelago

Lec 22密码学:加密体系与 RSA

讲义完成更新于 2026-09-17

Lec 22 密码学:加密体系与 RSA(Cryptography: Encryption & RSA)

TL;DR

  • 密码学演进范式:从依赖双方预共享信道的对称密钥体制,跨越至基于单向陷门函数(Trapdoor One-Way Function)的非对称公钥密码学。
  • Diffie-Hellman 密钥交换:利用乘法群 Zp∗\mathbb{Z}_p^* 幂运算的可交换性,在完全不安全的公开信道上建立共享密钥,其安全性严格锚定于离散对数(DLP)与 CDH 计算难题。
  • RSA 公钥密码体系:基于大整数素因子分解的不可逆性,通过欧拉函数与模逆元构建可逆幂运算 med≡m(modN)m^{ed} \equiv m \pmod N,实现加密与数字签名的双向统一。
  • NPC 与密码学鸿沟:揭示“最坏情况复杂性”与“平均情况困难性”的本质差异,剖析基于超递增背包的 Merkle-Hellman 密码体制为何被 LLL 格基约化算法全面击溃。

对称密码体制与密钥分发困境

在古典密码学与现代分组密码(如 DES、AES)中,通信双方采用相同的密钥 kk 进行信息加解密:

  • 加密过程:c=Ek(m)c = E_k(m)
  • 解密过程:m=Dk(c)m = D_k(c) 其中加密函数 EkE_k 与解密函数 DkD_k 在有限消息空间中构成一对互逆的双射置换。

密钥分发悖论与可交换锁直觉

假设 Alice 与 Bob 身处异地,中间的信道充斥着窃听者(海盗)。如果 Alice 必须先将对称密钥 kk 传输给 Bob,那么传输密钥本身就需要一条安全信道,从而陷入死循环。

如何利用不安全的信道安全传递秘密?考虑一个物理箱子与两把锁的比喻:

  1. Alice 将机密信件放入箱子,用自己的专属挂锁 KAK_A 上锁,寄给 Bob;
  2. Bob 收到上锁的箱子,无法打开,但用自己的专属挂锁 KBK_B 再上一道锁,寄回 Alice;
  3. Alice 收到拥有双重锁的箱子,用自己的钥匙解开 KAK_A,将留有 KBK_B 锁的箱子再次发给 Bob;
  4. Bob 用自己的钥匙解开 KBK_B,成功安全取出信件。

在整个物理流转过程中,箱子始终处于至少一把锁的保护之下。该方案在数学上成立的充要条件是:两道加密操作必须满足可交换性(Commutative Property),即解密顺序不必严格与加密顺序相反。


Diffie-Hellman 密钥交换协议

1976 年,Whitfield Diffie 与 Martin Hellman 提出了基于有限循环群指数运算的密钥协商协议,拉开了现代公钥密码学的序幕。

数学环境与公开参数

选取一个大素数 pp(如 2048 位)以及模 pp 乘法群 Zp∗={1,2,…,p−1}\mathbb{Z}_p^* = \{1, 2, \dots, p-1\} 的一个本原元(生成元)gg。 参数 (p,g)(p, g) 完全公开,所有参与者与窃听者皆可知晓。

Diffie-Hellman 密钥协商时序交互图

密钥协商执行时序

  1. Alice 本地计算:秘密生成随机私钥 a∈R{2,…,p−2}a \in_R \{2, \dots, p-2\},计算公钥: A=ga mod pA = g^a \bmod p 并将 AA 通过公开信道发送给 Bob;
  2. Bob 本地计算:秘密生成随机私钥 b∈R{2,…,p−2}b \in_R \{2, \dots, p-2\},计算公钥: B=gb mod pB = g^b \bmod p 并将 BB 通过公开信道发送给 Alice;
  3. 计算共享协商密钥:
    • Alice 收到 BB,结合自己的私钥 aa 计算: KAB=Ba mod p=(gb)a mod p=gab mod pK_{AB} = B^a \bmod p = (g^b)^a \bmod p = g^{ab} \bmod p
    • Bob 收到 AA,结合自己的私钥 bb 计算: KBA=Ab mod p=(ga)b mod p=gab mod pK_{BA} = A^b \bmod p = (g^a)^b \bmod p = g^{ab} \bmod p

双方在从未直接传输 KK、从未共享过私钥的前提下,协同求得了完全一致的共享密钥 K=gab mod pK = g^{ab} \bmod p。

安全性基石与中间人攻击

Diffie-Hellman 的安全性建立在群论的两大计算难题之上:

  • 离散对数问题(Discrete Logarithm Problem, DLP):已知 g,pg, p 和 ga mod pg^a \bmod p,在多项式时间内求指数 aa 在经典计算机上是不可行的;
  • 计算 Diffie-Hellman 问题(Computational Diffie-Hellman, CDH):给定 g,ga mod p,gb mod pg, g^a \bmod p, g^b \bmod p,在没有私钥 aa 或 bb 的辅助下计算 gab mod pg^{ab} \bmod p 是困难的。

警告

缺乏身份认证的中间人攻击(MitM) 由于公开信道未对身份进行签名背书,攻击者 Eve 可在链路中间分别拦截 Alice 与 Bob 的公钥,伪造自己生成的密钥对分别与双方协商出独立的密钥 KAEK_{AE} 与 KEBK_{EB},实现透明的实时解密与中继篡改。因此,Diffie-Hellman 必须配合**数字证书与公钥基础设施(PKI)**使用。


RSA 公钥加密体系

1977 年,Ron Rivest、Adi Shamir 与 Leonard Adleman 提出了第一个兼具实用性与完备数学证明的非对称公钥密码系统——RSA。

密钥生成算法

  1. 选取素数:独立随机生成两个互异的大素数 pp 与 qq(建议长度各 1024 比特以上);
  2. 计算模数:计算模数 N=p⋅qN = p \cdot q,其欧拉函数值为: ϕ(N)=(p−1)(q−1)\phi(N) = (p - 1)(q - 1)
  3. 选择公钥指数:挑选整数 ee,满足 1<e<ϕ(N)1 < e < \phi(N) 且 gcd⁡(e,ϕ(N))=1\gcd(e, \phi(N)) = 1(工业界通常固定取 e=65537=216+1e = 65537 = 2^{16} + 1,因其仅有 2 个二进制位为 1,能极大地加速模幂运算);
  4. 计算私钥指数:利用扩展欧几里得算法(Extended Euclidean Algorithm)求 ee 模 ϕ(N)\phi(N) 的乘法逆元 dd: e⋅d≡1(modϕ(N))e \cdot d \equiv 1 \pmod{\phi(N)}
  5. 分发密钥对:
    • 公钥(公开):PK=(N,e)PK = (N, e)
    • 私钥(保密):SK=(d,p,q)SK = (d, p, q)

加密与解密协议

对于任意明文消息 m∈{0,1,…,N−1}m \in \{0, 1, \dots, N-1\}:

  • 加密:使用接收者的公钥进行模幂运算: c=E(m)=me mod Nc = E(m) = m^e \bmod N
  • 解密:接收者使用自己的私钥还原明文: m=D(c)=cd mod Nm = D(c) = c^d \bmod N

正确性数学证明

定理

RSA 加解密恒等定理 对于任意 0≤m<N0 \le m < N,恒有 (me)d≡med≡m(modN)(m^e)^d \equiv m^{ed} \equiv m \pmod N。

证明: 由于 ed≡1(modϕ(N))e d \equiv 1 \pmod{\phi(N)},存在整数 kk 使得:

ed=1+k⋅ϕ(N)=1+k(p−1)(q−1)ed = 1 + k \cdot \phi(N) = 1 + k(p - 1)(q - 1)

我们分别在模 pp 与模 qq 下考察 medm^{ed}:

  1. 若 gcd⁡(m,p)=1\gcd(m, p) = 1,由费马小定理(Fermat's Little Theorem),mp−1≡1(modp)m^{p-1} \equiv 1 \pmod p: med=m⋅(mp−1)k(q−1)≡m⋅(1)k(q−1)≡m(modp)m^{ed} = m \cdot (m^{p-1})^{k(q-1)} \equiv m \cdot (1)^{k(q-1)} \equiv m \pmod p
  2. 若 mm 是 pp 的倍数,则 m≡0(modp)m \equiv 0 \pmod p,显然 med≡0≡m(modp)m^{ed} \equiv 0 \equiv m \pmod p。 综合可知,对任意整数 mm,恒有 med≡m(modp)m^{ed} \equiv m \pmod p。 同理可证 med≡m(modq)m^{ed} \equiv m \pmod q。 因为 pp 与 qq 为互异素数,由中国剩余定理(Chinese Remainder Theorem, CRT),必有:
med≡m(modp⋅q)  ⟹  med≡m(modN)m^{ed} \equiv m \pmod{p \cdot q} \implies m^{ed} \equiv m \pmod N

证毕。


计算复杂性与密码学安全性的深刻鸿沟

在第 16 讲中,我们学习了 NP 完全问题(NPC)。许多人直觉上认为:“既然 NP 完全问题是最难的,那我们为什么不直接用 NPC 问题构造密码学体系,岂不是坚不可摧?”

事实恰恰相反:基于经典 NP 完全问题设计的加密系统绝大多数在工业上走向了失败。

最坏情况 vs 平均情况

  • NP 完全性(NPC)的本质:它仅仅保证了**在最坏情况下(Worst-Case)**求解是极其困难的,无法在多项式时间内攻克;
  • 密码学安全性的本质:它要求**在几乎所有的平均实例下(Average-Case)**都是不可攻破的! 若一个密码系统只在万分之一的极端恶意样本下安全,而敌手随机抓取 99.99% 的公钥和密文都能在几毫秒内解密,这个系统在工程上就是完全报废的。

典型反例:图 3-着色问题的平凡平均性

图 3-着色问题是经典 NPC 问题。然而如果我们在现实中随机生成一张无向图:

  • 当边密度超过临界阈值时,图中以极高概率迅速包含一个包含 4 个顶点的完全子图 K4K_4;
  • 简单的回溯剪枝算法在平均访问不到 197 个顶点时即可确定性输出“不可 3 着色”;
  • 最坏情况的极端困难性在平均分布面前彻底坍缩。

经典悲剧:Merkle-Hellman 背包密码体系的覆灭

Ralph Merkle 与 Martin Hellman 曾尝试基于 NP 完全的**子集和(Subset Sum / 背包问题)**设计公钥密码体系:

  1. 超递增私钥:私钥构造为一个“超递增序列” w1,w2,…,wnw_1, w_2, \dots, w_n(满足每个元素大于前序所有元素之和 wj>∑i=1j−1wiw_j > \sum_{i=1}^{j-1} w_i)。对于超递增背包,贪心算法可在 O(n)O(n) 线性时间内完美求出子集和;
  2. 模乘伪装公钥:选取与模数 MM 互素的随机乘子 NN,将超递增序列整体进行模变换:ai=(wi⋅N) mod Ma_i = (w_i \cdot N) \bmod M,作为公钥发布。公钥外观看起来如同一个极其混乱的通用 NP 完全背包;
  3. 加密与解密:发送方用公钥 aia_i 计算明文 0-1 向量的加权和作为密文 C=∑miaiC = \sum m_i a_i;接收方利用模逆元 N−1 mod MN^{-1} \bmod M 消除伪装,还原为超递增背包快速解密。

为什么 Merkle-Hellman 会被击溃?

1982 年,Adi Shamir 利用刚刚被发明的 LLL 格基约化算法(Lenstra–Lenstra–Lovász Lattice Reduction) 彻底破解了该方案。

  • 背包的**密度(Density)**定义为 d=nmax⁡ilog⁡2aid = \frac{n}{\max_i \log_2 a_i};
  • 超递增序列的急剧增长迫使公钥模数必须极大,导致生成的公钥背包密度极低(d<1d < 1);
  • 低密度子集和问题可以严格转化为高维欧氏空间中的格最短向量问题(Shortest Vector Problem, SVP);
  • LLL 算法能够在多项式时间内在格空间中高效找到极短基向量,从而直接剥除线性同余伪装,使得基于背包的密码体系在工程实践中被一网打尽。

这一历史教训彻底警示了密码学界:不能脱离代数代际结构盲目套用 NPC 概念,唯有具备严密数论代数对称性(大数分解、离散对数、高维环上容错学习 LWE)的结构,才能提供经受住历史检验的真实平均安全性。


我的理解

公钥密码学是 20 世纪下半叶计算机科学对人类文明最惊艳的馈赠:

  1. 单向陷门的非对称之美:乘法与求模极其廉价,因数分解与求离散对数却昂贵得超脱物理极限。公钥加密的灵魂就是这种“单向易行、逆向不可破,但持有陷门(私钥)即畅通无阻”的单向陷门函数。它打破了人类数千年“秘密必须对称保管”的思维定势。
  2. 从算法设计到对抗博弈的跃迁:一般算法追求的是“为给定问题设计最高效的解法”,而密码学追求的是“为敌手设计一个最不可能求解的迷宫”。这种对抗性思维,迫使计算机科学家对计算复杂性中的“最坏情况”与“平均情况”进行刮骨疗毒般的深刻审视。
  3. 数论的纯洁性救赎:高斯曾说“数学是科学的皇后,而数论是数学的皇后”。在近两百年的时间里,数论中的素数、模算术、费马小定理一直被视作没有任何实际功利价值的“纯粹思维游戏”。然而正是 RSA 和现代密码学,将这些沉睡在象牙塔的抽象数论瑰宝,化作守护当今全球互联网金融、数字主权与隐私通信的最坚固盾牌。 :::