在钻进 RSA 和椭圆曲线之前,先备齐弹药:模运算、单向函数,以及那个让整座大厦稳稳站立的"离散对数难题"。
整个 Phase 2 我们都困在一个死结里:对称密码要求双方先共享密钥,可密钥又得通过不安全的网络传送。公钥密码学解开了这个结,而它用的钥匙是数学——具体说,是几个"算过去容易、算回来极难"的数论运算。这一章不推公式证明,只帮你建立够用的直觉。别担心,需要的数学我们从零讲起。
你其实早就懂模运算——看钟就是。现在 10 点,过 5 小时是几点?15 点,但钟面只到 12,于是 15 mod 12 = 3 点。模运算就是"数到头就绕回来"。第 2 章的凯撒密码(mod 26)、AES 的字节运算,全是它。
公钥密码几乎都在一个"素数大小的钟面"上做运算:选一个素数 p,所有运算结果都 mod p,数值永远落在 0 … p−1 之间。这个有限的、会绕圈的世界,是接下来一切的舞台。
当 p 是素数时,1 … p−1 这些数在乘法和求逆下表现得特别"完美"(数学上叫构成一个域):每个非零元素都有唯一的乘法逆元(第 16 章 RSA 生成密钥要用),而且存在生成元——一个数,它的幂能不重不漏地遍历所有非零元素。素数的这些良好性质,是密码算法能成立的地基。
公钥密码的核心,是找到一个单向函数:正着算轻而易举,反着算(在不知道"陷门"的情况下)难如登天。生活里的类比是混合颜料——把黄和蓝调成绿,一秒钟的事;可给你一桶绿,让你分离出原来的黄和蓝,几乎不可能。密码学需要的正是这种"计算上的不可逆"。
而数论里最好用的一个单向函数,叫模幂运算:
给定 g、x、p,算出 y 非常快(哪怕 x 是几百位的大数,用"平方-乘"技巧也瞬间完成)。但反过来——已知 g、p 和结果 y,要倒推出指数 x——就是传说中的离散对数问题(DLP),当 p 足够大时,没有已知的高效算法能解开它。
普通的幂 g^x 是单调递增的,已知结果反推 x 很容易(取个对数就行)。但一旦套上 mod p,结果就在钟面上疯狂跳跃,毫无规律可循——这正是"离散"对数难的直观来源。下面的时钟把 g^1, g^2, g^3, … 依次标在 mod p 的钟面上,你会看到指针跳得像随机数。
还有一块拼图专门为 RSA 准备。定义欧拉函数 φ(n) = 小于 n 且与 n 互质的正整数个数。当 n = p·q 是两个素数之积时,φ(n) = (p−1)(q−1)。
欧拉定理说:若 a 与 n 互质,则
这个"绕一整圈回到 1"的性质,直接给了 RSA 一个魔法:如果两个指数 e 和 d 满足 e·d ≡ 1 (mod φ(n)),那么先用 e 次方加密、再用 d 次方解密,就能精确还原原数(因为总指数相当于绕了整数圈再多走 1 步)。谁知道 φ(n),谁就能算出配对的 d;而算 φ(n) 需要把 n 分解成 p·q——这就是 RSA 的另一个单向难题:大数分解。第 16 章会把这套机制完整跑一遍。
公钥密码的安全性,归根结底押注在两类"算不回去"的数学难题上:
① 离散对数(DLP) → Diffie-Hellman、椭圆曲线(ECC)、ECDSA(第 15、17、18 章);
② 大数分解 → RSA(第 16 章)。
注意"押注"二字:我们没有证明这些问题真的无解,只是几十年来最聪明的人都没找到快速解法。这也是为什么量子计算机是威胁——Shor 算法恰好能高效解开这两个问题(第 26 章)。公钥密码的安全是计算假设,不是数学定理。
你不需要会证明欧拉定理,就像你不需要会推导 AES 的 S-盒也能正确用 AES。真正重要的是三个直觉:①运算在一个"素数钟面"上绕圈;②模幂正着容易、反着(离散对数)极难;③存在"陷门"(知道 p、q 或私钥)的人能轻松算回去。握住这三点,后面四章都会顺理成章。剩下的大数运算,交给库和下面的 Demo。
弹药备齐。下一章,我们就用"模幂正着容易、反着极难"这一个性质,让 Alice 和 Bob 在全世界围观下,凭空商定出一把只有他们俩知道的密钥——密码学史上最优雅的把戏之一。
y=gˣ mod p 正着好算,反推指数(离散对数)极难。a^φ(n)≡1 是 RSA 的引擎;算 φ(n) 需分解 n=p·q,即大数分解难题。