从两个素数 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 是秘密的,颜色已经标好了。
不可以。本工具只是用来直观理解原理的教学演示,把 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)确认密钥的文化也已经形成。
最后注意,「公钥加密、私钥解密」并不是 RSA 的全部对应关系。在数学上 RSA 是对称的,可以「用 e 加密 → 用 d 解密」,也可以「用 d 加密 → 用 e 验证」。前者叫加密,后者叫签名。但实际工程中两种用途必须分开使用不同的密钥,并遵循 PKCS#1 等标准方案。本演示为了展示数学本质做得很简洁,但请避免在真实实现中「拿加密用的密钥去签名」之类的混用。