MathLabs

应用与计算数学

密码学

利用数论与代数来保护信息安全,从RSA到现代加密方案。

直观给消息上锁,只有对的人才能打开

设想有一把任何人都能扣上、但只有一把特定钥匙才能打开的挂锁。如果每个人都公开自己的挂锁(但对钥匙保密),那么任何人都可以为你锁住一条消息,而只有你才能读出来——无需事先见面,也无需暗号。这正是公钥密码学的核心思想:"上锁"这一操作在一个方向上很容易计算,而在没有密钥的情况下,即便挂锁的设计本身是公开的,在计算上也无法可行地逆转。

一个在单位圆上旋转的点,展示了类似模幂运算的周期性重复。
Z/17Z\mathbb{Z}/17\mathbb{Z} 上的模乘映射 x↦ax mod mx \mapsto a x \bmod m:正向计算轻而易举,而在大模数下逆向求解离散对数或RSA幂映射的困难性正是公钥密码学的基础。

中学模运算:基础构件

定义: 同余与模幂运算

两个整数 aa 和 bb 在模 nn 下同余,记作 a≡b(modn)a \equiv b \pmod{n},当且仅当 n∣(a−b)n \mid (a-b) 成立:即它们的差恰好是 nn 的倍数。模幂运算就是将一个底数对模 nn 反复自乘,这正是RSA和Diffie-Hellman等密码方案所依赖的运算,因为它正向计算很快,而反向求解却很困难。

a≡b(modn)  ⟺  n∣(a−b)a \equiv b \pmod{n} \iff n \mid (a-b)

这里 n∣(a−b)n \mid (a-b) 表示 nn 整除 a−ba-b,因此 a≡b(modn)a \equiv b \pmod{n} 实质上是一个关于余数的陈述: aa 和 bb 被 nn 除时余数相同。下面的欧拉定理推广了费马小定理,正是RSA解密能够还原出原始消息背后的原理。

aϕ(n)≡1(modn)whenevergcd⁡(a,n)=1a^{\phi(n)} \equiv 1 \pmod n \quad \text{whenever} \quad \gcd(a,n)=1
三种密码方案比较
方案所依赖的困难问题典型密钥长度(2026年)
RSA将 n=pqn=pq 分解为素因数2048-4096比特
Diffie-Hellman模素数的离散对数2048-3072比特
椭圆曲线密码学(ECC)椭圆曲线群上的离散对数256-384比特

大学RSA为何有效,以及Diffie-Hellman如何创建共享密钥

设 n=pqn = pq 是两个不同素数之积,且 ee 与 dd 满足 ed≡1(modϕ(n))ed \equiv 1 \pmod{\phi(n)}。那么对任意满足 0≤m<n0 \le m < n 的消息 mm,用 ee 加密后再用 dd 解密可以还原出原始消息: (me)d≡m(modn)(m^e)^d \equiv m \pmod n。

为什么成立?

这条定理正是让RSA真正可用的关键:它保证无论发送方用公钥指数加密什么内容,持有私钥指数的人总能解密——对每一个可能的消息都成立,而不仅仅是大多数情形——证明中必须处理消息恰好与模数共享因子的边界情形。

证明

由于 ed≡1(modϕ(n))ed \equiv 1 \pmod{\phi(n)},根据模同余的定义,存在非负整数 kk 使得 ed=1+kϕ(n)ed = 1 + k\phi(n) 成立。

情形一:gcd⁡(m,n)=1\gcd(m,n)=1。由欧拉定理有 mϕ(n)≡1(modn)m^{\phi(n)} \equiv 1 \pmod n,将两边同时 kk 次幂再乘以 mm,得到 med=m⋅(mϕ(n))k≡m⋅1k≡m(modn)m^{ed} = m \cdot (m^{\phi(n)})^{k} \equiv m \cdot 1^{k} \equiv m \pmod n。

情形二:gcd⁡(m,n)≠1\gcd(m,n) \ne 1。由于 n=pqn = pq,这意味着 pp 整除 mm 或者 qq 整除 mm(不会同时成立,因为 mm 小于 nn)。在模 pp 下考虑:若 pp 整除 mm,则 mm 与 medm^{ed} 在模 pp 下都同余于 00;否则 gcd⁡(m,p)=1\gcd(m,p)=1,由费马小定理有 mp−1≡1(modp)m^{p-1} \equiv 1 \pmod p,又因为 (p−1)(p-1) 整除 ϕ(n)\phi(n),与情形一相同的计算给出 med≡m(modp)m^{ed} \equiv m \pmod p。在模 qq 下的论证完全相同,给出 med≡m(modq)m^{ed} \equiv m \pmod q。

由中国剩余定理,分别在模 pp 和模 qq 下成立的同余式,在其乘积 n=pqn=pq 下也成立,因此 (me)d≡m(modn)(m^e)^d \equiv m \pmod n 对每一个消息 mm 都成立,而不仅仅是那些与 nn 互素的消息。

固定一个素数 pp 和一个底数 gg。若Alice选取秘密值 aa 并发送 A=ga mod pA = g^a \bmod p,Bob选取秘密值 bb 并发送 B=gb mod pB = g^b \bmod p,那么计算 Ba mod pB^a \bmod p 与 Ab mod pA^b \bmod p 会得到相同的值 gab mod pg^{ab} \bmod p,尽管 aa 和 bb 都从未被传输过。

为什么成立?

这正是使两方能够在被窃听者监视的公开信道上协商出一个密钥的原因:窃听者能看到底数、模数以及双方的公开值,但要从中还原出共享密钥,需要求解离散对数问题,在参数选择恰当的情况下,该问题被认为在计算上是困难的。

证明

根据定义,A=ga mod pA = g^a \bmod p 与 B=gb mod pB = g^b \bmod p 都是模幂运算的结果,因此Bob收到 AA 后计算 Ba=(gb)a mod pB^a = (g^b)^a \bmod p,而Alice收到 BB 后计算 Ab=(ga)b mod pA^b = (g^a)^b \bmod p。

模幂运算遵循与普通幂运算相同的指数法则,因为在模 pp 下的重复相乘,与整数的重复相乘的复合方式完全相同,只是在每一步都对模 pp 取约化:作为 gg 的指数有 (gb)a=gba=gab=(ga)b(g^b)^a = g^{ba} = g^{ab} = (g^a)^b,并且这个等式在每一步取模 pp 约化后依然成立。

因此 Ba mod p=gab mod p=Ab mod pB^a \bmod p = g^{ab} \bmod p = A^b \bmod p:Alice与Bob各自独立地从自己的秘密指数和对方的公开值计算出相同的量 gab mod pg^{ab} \bmod p,而秘密值 aa 或 bb 从未出现在信道上。

安全性论证与这个正确性论证是分开的:正确性只说明双方得到了同一个数;从 gg、pp 和 AA 计算出 aa 的困难性(离散对数问题),才是使这个共享数字对观察者保密的原因。

大学实际应用与典型例题

每一次HTTPS连接、每一款安全通讯应用、每一个加密货币钱包都依赖于上述定理:TLS握手使用Diffie-Hellman(或其椭圆曲线变体)来协商会话密钥,银行系统与软件更新使用RSA或ECDSA签名来保证真实性,而区块链钱包利用椭圆曲线上的离散对数,使得从公开地址推导出私钥在计算上不可行。下面两个例子用较小的数字手工演算RSA与Diffie-Hellman,使每一步都可验证。

例题: 用小素数手工计算RSA

使用素数 p=5p=5 和 q=11q=11,公钥指数为 e=3e=3,消息为 m=2m=2,求出密文,并验证解密能还原出该消息。

解答

第一步:计算模数 n=5×11=55n = 5 \times 11 = 55 和 ϕ(n)=(5−1)(11−1)=40\phi(n) = (5-1)(11-1) = 40。

第二步:检验 gcd⁡(3,40)=1\gcd(3,40)=1,因此 e=3e=3 是合法的公钥指数。

第三步:求满足 3d≡1(mod40)3d \equiv 1 \pmod{40} 的私钥指数 dd。取 d=27d=27 得到 3×27=81=2×40+13 \times 27 = 81 = 2 \times 40 + 1,因此 d=27d=27 可行。

第四步:加密 m=2m=2:密文为 c=23 mod 55=8 mod 55=8c = 2^3 \bmod 55 = 8 \bmod 55 = 8。

第五步:通过计算 c27 mod 55=827 mod 55c^{27} \bmod 55 = 8^{27} \bmod 55 来解密。对模55反复平方:82=64≡98^2 = 64 \equiv 9, 84≡92=81≡268^4 \equiv 9^2 = 81 \equiv 26, 88≡262=676≡168^8 \equiv 26^2 = 676 \equiv 16, 816≡162=256≡368^{16} \equiv 16^2 = 256 \equiv 36。由于 27=16+8+2+127 = 16+8+2+1,计算 816⋅88⋅82⋅81≡36⋅16⋅9⋅8(mod55)8^{16} \cdot 8^{8} \cdot 8^{2} \cdot 8^{1} \equiv 36 \cdot 16 \cdot 9 \cdot 8 \pmod{55},逐步化简得到 22。

第六步:解密得到的值为 22,正是原始消息,这在这个具体实例上验证了RSA正确性定理。

例题: 手工演算Diffie-Hellman密钥交换

给定素数 p=23p=23 和底数 g=5g=5,Alice选取秘密值 a=6a=6,Bob选取秘密值 b=15b=15。用两种方式分别计算共享密钥,并验证它们相符。

解答

第一步:Alice计算 A=56 mod 23A = 5^6 \bmod 23。逐步计算5对23取模的幂:52=25≡25^2=25\equiv2, 53≡105^3\equiv10, 54≡45^4\equiv4, 55≡205^5\equiv20, 56≡85^6\equiv8。故 A=8A=8。

第二步:Bob计算 B=515 mod 23B = 5^{15} \bmod 23。利用上面的 56≡85^6\equiv8,有 512≡82=64≡185^{12}\equiv8^2=64\equiv18,以及 515=512⋅53≡18⋅10=180≡195^{15}=5^{12}\cdot5^3\equiv18\cdot10=180\equiv19。故 B=19B=19。

第三步:Alice计算共享密钥为 Ba mod p=196 mod 23B^a \bmod p = 19^6 \bmod 23。由于 19≡−419\equiv-4,有 196≡(−4)6=46=409619^6\equiv(-4)^6=4^6=4096,又 4096=178×23+24096 = 178\times23+2,所以该值等于 22。

第四步:Bob计算共享密钥为 Ab mod p=815 mod 23A^b \bmod p = 8^{15} \bmod 23。写作 8=238=2^3 得到 815=2458^{15}=2^{45};由于 211≡1(mod23)2^{11}\equiv1 \pmod{23}(直接验证:211=2048=89×23+12^{11}=2048=89\times23+1),且 45=4×11+145=4\times11+1,该式化简为 21=22^{1}=2。

第五步:两种计算都得到 22,确认Alice与Bob在从未通过信道传输 a=6a=6 或 b=15b=15 的情况下,就共享密钥达成了一致。

在 n=55n=55, ϕ(n)=40\phi(n)=40,公钥指数 e=3e=3 的RSA中,哪个 dd 的值满足 3d≡1(mod40)3d \equiv 1 \pmod{40}?

Diffie-Hellman密钥交换的安全性依赖于哪个底层计算问题?

若 gcd⁡(a,n)=1\gcd(a,n)=1,欧拉定理指出 aϕ(n)≡1(modn)a^{\phi(n)} \equiv 1 \pmod n,其中 ϕ(n)\phi(n) 计数的是以下哪一项?

一家银行想要为软件更新签名,以便客户能够验证更新确实来自该银行且未被篡改。哪种密码工具能直接提供这种保证?

参考文献

  1. Alfred J. Menezes, Paul C. van Oorschot, Scott A. Vanstone (1996). Handbook of Applied Cryptography
  2. Peter W. Shor (1994). Algorithms for Quantum Computation: Discrete Logarithms and Factoring · arXiv:quant-ph/9508027
  3. National Institute of Standards and Technology (2024). Module-Lattice-Based Key-Encapsulation Mechanism Standard (FIPS 203)