RSA 加密模拟器 返回
密码学教学演示

RSA 加密模拟器 — 密钥生成与加密、解密

从两个素数 p、q 构造 RSA 密钥对 (n, e, d),并对明文 m 进行加密与解密。教学用的小规模演示,把公钥密码学的每一步都缩小到能手算的规模。

参数设置
素数 p
素数 q
公钥指数 e
明文 m

若 p、q 不是素数会自动取最近的素数。e 必须满足 gcd(e, phi(n)) = 1。

计算结果
公开模数 n = p·q
欧拉函数 φ(n)
私钥指数 d
密文 c = m^e mod n
密钥对与加密流程

左=密钥对 (n, φ, e, d)/右=加密流程 m → [^e mod n] → c → [^d mod n] → m'

理论与主要公式

RSA 是以整数因式分解的困难性为安全性根据的公钥密码方案。密钥生成步骤如下:

选择两个素数 p、q,计算公开模数与欧拉函数:

$$n = p\,q, \qquad \varphi(n) = (p-1)(q-1)$$

公钥指数 e 必须与 φ(n) 互素:gcd(e, φ(n)) = 1。私钥指数 d 是 e 在模 φ(n) 下的乘法逆元(用扩展欧几里得算法求得):

$$e\,d \equiv 1 \pmod{\varphi(n)}$$

加密与解密都是在模 n 下的幂运算:

$$c = m^{e} \bmod n, \qquad m' = c^{d} \bmod n$$

前提是 0 ≤ m < n。由 Fermat–Euler 定理保证 m' = m。

RSA 加密模拟器是什么

🙋
RSA 这个名字听过,可它到底在做什么?我打开这个模拟器看到一堆数字,有点被吓到。
🎓
简单说,就是把两个素数 p、q 自己藏起来,只把它们的乘积 n = p·q 公开。在上面的默认值里 p=11,q=13,所以 n=143。任何人都看得到 n,但要从 n 反过来分解出 p、q,也就是「素因数分解」,对大数来说非常困难——这就是 RSA 的安全感来源。「密钥对」面板里 n 与 e 是公开的,p、q、d 是秘密的,颜色已经标好了。
🙋
那 e 和 d 是什么呢?我把明文 m 设成 42,密文就出来 81 了。
🎓
e 是公钥指数,d 是私钥指数。加密公式是 $c = m^e \bmod n$,默认值下就是 $42^7 \bmod 143 = 81$。手算一下:$42^2 = 1764 \equiv 48 \pmod{143}$,$42^4 \equiv 48^2 = 2304 \equiv 16$,最后 $42^7 = 42 \cdot 48 \cdot 16 = 32256 \equiv 81 \pmod{143}$,刚好是计算器能跟上的范围。
🙋
解密呢?d 显示是 103,但 $81^{103}$ 我感觉手算根本不可能啊…
🎓
这里要用「模幂运算(modular exponentiation)」的技巧。不要一次性算出巨大中间数,而是反复平方、每一步都对 n 取模。模拟器内部用 BigInt 与二进制展开来做。重点是结果:$81^{103} \bmod 143$ 会回到 42。如果上面 m' 框变绿色显示 42,就说明加解密一圈走通了。
🙋
为什么会回到 42 呢?感觉像变魔术…
🎓
这是 Fermat–Euler 定理在起作用。我们是按 $e \cdot d \equiv 1 \pmod{\varphi(n)}$ 来选 d 的,因此 $(m^e)^d = m^{ed} \equiv m \pmod n$。实际工程里 p、q 都是 1024 位级别,n 至少 2048 位,但原理跟本演示完全一样。试着把 e 调一调,看 d 与 c 都会跟着变。

常见问题

如果 p、q 泄露,任何人都能立刻算出 φ(n) = (p−1)(q−1),再用扩展欧几里得算法从 e 推出 d,于是整个私钥就暴露了,所有密文都能被解开。RSA 的安全性核心建立在「无法在合理时间内把 n 分解为 p、q」这一假设之上,一旦素数本身被知晓,这一假设就失去了意义。
65537 = 2¹⁶ + 1 是素数(费马素数),与几乎所有 φ(n) 都互素。它的二进制表示是「100000000000000001」,只有两个 1,因此用平方-乘法做模幂运算时所需乘法次数极少,加密非常快。同时它又足够大,可以避免 e=3 等过小指数才会出现的 Coppersmith 类攻击。各方面平衡下来,65537 成为事实标准。
不可以。本工具只是用来直观理解原理的教学演示,把 p、q 限制在 100 以内的小素数。生成的 n 只有 3~4 位十进制,任何人几秒就能完成因式分解。现代标准要求 n 至少 2048 位(十进制 600 位以上)。生产环境还必须配合 OAEP 等填充和随机化,「教科书 RSA」直接上线被视为禁忌。
RSA 在模 n 下计算,所以明文 m 必须满足 0 ≤ m < n。比如 p=3、q=5 时 n 只有 15,把 m=42 传进去显然超出范围。即使加密了,解密也只能还原出 m mod n,无法恢复原始的 42。请把 p、q 调大让 n 超过 100,或者把 m 调小。实现里通常会把长消息切成「小于 n 的块」,或与对称密码组合使用。

实际应用

HTTPS / TLS 的密钥交换与签名:浏览器地址栏的「锁形图标」背后,服务器证书的签名验证以及握手时的密钥交换备选路径中,RSA 仍被广泛使用。沿证书链一路追溯,根 CA 用 RSA 签名是常见做法。

PGP / GnuPG 的邮件加密与签名:个人和企业的邮件加密、软件发布签名(如 Linux 发行版的软件包签名)长期采用 RSA 密钥对。它适合长期「身份」类用途,并且让人通过指纹(fingerprint)确认密钥的文化也已经形成。

SSH 公钥认证:远程登录广泛使用的 ssh-rsa 密钥就是本演示的放大版。客户端用私钥 d 对挑战签名,服务器用预先注册的公钥 (n, e) 验证。近年来 Ed25519 在普及,但 RSA-4096 密钥仍在大量使用。

身份证 / 智能卡的认证:各类电子身份卡和企业智能卡里,RSA 私钥保存在卡内的安全区域,签名运算完全在卡内完成。私钥从不离开芯片,即便宿主机被攻陷,密钥也不会被窃取。

常见误解与注意事项

最常见的误解是「教科书 RSA 直接拿来用就够安全了」。本模拟器演示的是「确定性 RSA」,同样的明文加密总会得到同样的密文,对短而可猜的消息很容易被字典攻击命中。生产实现必须配合 OAEP(Optimal Asymmetric Encryption Padding)这类带随机数的填充方案,让相同明文每次产生不同密文。签名场景下当前推荐 PSS 填充。

第二个常见错误是只用「比特数」来比较安全强度。听到「RSA 2048 位」会让人感觉与对称密码的 2048 位等价,但实际安全要看「等效安全强度」。RSA 2048 大约相当于对称密码的 112 位安全强度。要等价于 AES-128 需要 RSA 3072,要等价于 AES-256 则需要 RSA 15360(NIST 指南)。请记住不同体制的密钥长度无法简单换算。

最后注意,「公钥加密、私钥解密」并不是 RSA 的全部对应关系。在数学上 RSA 是对称的,可以「用 e 加密 → 用 d 解密」,也可以「用 d 加密 → 用 e 验证」。前者叫加密,后者叫签名。但实际工程中两种用途必须分开使用不同的密钥,并遵循 PKCS#1 等标准方案。本演示为了展示数学本质做得很简洁,但请避免在真实实现中「拿加密用的密钥去签名」之类的混用。