为理解这个过程,我们需要完成一次完整的 RSA 简化版运算

假设有两个素数,分别是:17和53作为私钥。

第一步:准备材料(生成密钥)

  1. 选素数: p = 17, q = 53。
  2. 算公钥 N: N = 17 * 53 = 901。
  3. **算秘密中间量 ϕ(n):**ϕ(n) = (17-1) * (53-1) = 832。
  4. 选加密指数e: 我们通常选一个小素数,比如e = 3。(只要e 和 832 互质就行)。
    • 公钥就是:(901, 3)。你可以把这对数字发给任何人。
  5. 算解密指数 d: 这是最关键的一步。我们需要找一个数字 d,使得 d * e / 832 的余数等于 1。
    • 计算过程:d * 3 / 832 = 余 1。
    • 经过数学计算(辗转相除法),我们算出 d = 555
    • 检查一下:555 * 3= 1665。而 1665 = 832 * 2 + 1。正好余 1 !
    • 私钥就是:(901, 555)。这个 555 只有你自己知道。

第二步:加密过程(发件人操作)

现在,你的朋友想把秘密数字 15 发给你。他手里只有你的公钥 (901, 3)。

  • 公式: 密文= 原文^e mod(N) (mod(N) 表示除以N取余数)
  • 计算: 15^3 = 3375
  • 取余: 3375 / 901 = 3 …… 余 672
  • 结果: 你的朋友在微信上给你发了一个数字 672

第三步:解密过程(你作为接收者)

你收到了乱码 $672$。别人看着这数字毫无意义,但你拥有私钥 $d = 555$。

  • 公式: 原文 = 密文 (mod N)
  • 计算: 你需要计算 672^555 / 901 的余数。
  • 这个数字虽然极大(计算机可以轻松处理),但根据费马小定理和欧拉定理的巧妙推导,数学保证了:
    • 672^555 / 901 的余数一定等于 15!

为什么这一步有效?

这个过程最神奇的地方在于:d是e在模 ϕ(n)世界里的“倒数”。

在普通的乘法里,3 * (1/3) = 1。

在 RSA 的世界里,e负责把数字“推向”混乱,而 d负责把这个混乱“拉回”原点。

如果你没有 17 和 53:

  1. 你只看到公钥 901 和密文 672。
  2. 你想解密,就必须算出 d。
  3. 要算出 d,你必须知道 ϕ(n)(即 832)。
  4. 要算出 832,你必须知道 901 是哪两个素数相乘的。
  5. 如果你无法分解 901,你就永远找不到那个解密指数 555。