先想明白要造什么
回忆锁盒类比:我们要造一对「数学上配套」的钥匙——公钥公开加密,私钥独自解密,且外人无法从公钥推出私钥。RSA 的天才之处是找到了这样一对数字关系,它的原料是两样人人熟悉的东西:
- 素数:把两个大素数相乘一瞬间;把乘积拆回素数近乎永恒(正易反难的不对称)。
- 模运算:乘方之后只留余数,把天文数字压回固定范围,像钟表永远只显示 1–12 点。
公钥 = 公开的锁(人人可用它扣上箱子);私钥 = 家里的钥匙(只有它能打开)。RSA 的全部工程,就是用素数和模运算把这对「锁与钥匙」造出来。
密钥生成:五个步骤
- 挑两个素数 p 和 q这是你的秘密核心,只有你知道。真实 RSA 里它们各约 300 位十进制长;教学演示中用 11、13 这类小素数即可。
- 算乘积 n = p × qn 将公开(它是「锁」的一部分)。同时算 φ(n) = (p−1) × (q−1),这是一个关键中间量,必须保密。
- 选公钥指数 e挑一个与 φ(n) 互质(没有公因数)的数,常用 65537。公钥 = (e, n),广而告之。
- 算私钥指数 d找到 d,使得 (e × d) mod φ(n) = 1。d 是 e 在「φ(n) 世界」里的逆——只有知道 p、q 的人才能算出 φ(n),从而才能算出 d。
- 销毁中间量公钥 (e, n) 张贴出去;私钥 d 保密;p、q 和 φ(n) 用完即毁。锁与钥匙就此分家。
为什么外人推不出 d?算 d 必须先有 φ(n);而 φ(n) = (p−1)(q−1) 依赖把 n 拆成 p×q。「拆大数」正是那个正易反难的运算——公钥就这样安全地锁住了私钥的秘密。
加密与解密:一条公式的故事
先把要发送的内容变成一个数字 m(比如字母按编码表转成数字),要求 m < n。然后:
先别急着问为什么能还原——直接感受一下数字(p=3, q=11, n=33, φ=20, e=3, d=7,发送 m=4):
- 加密:c = 4³ mod 33 = 64 mod 33 = 31。原文 4 变成了面目全非的 31。
- 解密:m = 31⁷ mod 33 = 27,512,614,111 mod 33 = 4。原文完好归来。
密文 31 在 0–32 之间晃了一圈回到 4——模运算的世界就像钟表盘,乘方把指针推走很多圈,私钥 d 恰好是「把指针原路拨回来」的圈数。
为什么加密后必然能解回来?
背后是 18 世纪数学家欧拉发现的一条定律(欧拉定理)的推论,用大白话说:
在「mod n 的钟表世界」里,只要 e 和 d 配套(e×d ≡ 1 mod φ(n)),那么「用 e 转过的钟,再用 d 转回去,指针必然回到原位」:m 的 e 次方再 d 次方,等价于 m 的 (e×d) 次方,而 e×d 在 φ(n) 世界里等于 1,于是结局必然是 m。
e×d ≡ 1 (mod φ(n)) 这句话就是「配套」的数学定义:它是第 4 步生成 d 时唯一的要求。所以 RSA 不是「碰巧能解回来」,而是构造性地保证能解回来——d 从一开始就是按「解铃人」的身份算出来的。
顺带回答一个常见疑惑:「加密用 e、解密用 d,那用 d 加密、e 解密行不行?」行——这正是数字签名的原理:私钥「加密」= 签名,公钥「解密」= 验证签名(详见现实应用)。
三个诚实的附注
- 教学 RSA ≠ 工业 RSA:真实系统不会对文本逐字符加密,而是配合随机填充(OAEP)与混合加密,防止重放与模式泄露。实验室为了让人算得懂做了极简处理,区别在哪见现实应用。
- m 必须 < n:钟表盘只有 n 个刻度,超出就会「截断」。真实 RSA 的 n 巨大,所以能整块处理 256 字节数据。
- 素数必须随机挑选:若两人生成密钥时用了同样的 p、q,私钥就一样了。真实系统用密码学随机数挑素数,这曾是某些设备的真实漏洞来源。
常见疑问
φ(n) 到底是什么?为什么是 (p−1)(q−1)?
φ(n) 读作「phi」,数的是「1 到 n 之间有多少个数与 n 没有公因数」。当 n = p×q(p、q 是素数)时,这个数量恰好是 (p−1)(q−1)。它决定了钟表盘上「一圈有多少格」,是 e 和 d 配套关系的世界常数。
为什么常用 e = 65537?
它是素数、形如 2¹⁶+1(二进制只有两个 1),做 m^e 运算又快又不容易踩进已知的弱实现陷阱。e 不是秘密,选它纯属「好用又稳」的工程惯例。
加密、解密公式一样,为什么不能反推?
你完全可以用公钥自己加密任意数字做实验,但从「c = m^e mod n」反解 m(即「模运算下开 e 次方」)被数学上等价于分解 n——又一次回到「拆大数」这个不可逾越的墙。
书上的公式怎么和这里的不太一样?
专业书籍用字母 λ(n)(卡迈克尔函数)代替 φ(n) 来计算 d,本质相同,只是「钟表盘的格数」取得更精巧、d 通常更小。入门阶段记住 φ(n) 版本完全够用。