为理解这个过程,我们需要完成一次完整的 RSA 简化版运算。
假设有两个素数,分别是:17和53作为私钥。
第一步:准备材料(生成密钥)
- 选素数: p = 17, q = 53。
- 算公钥 N: N = 17 * 53 = 901。
- **算秘密中间量 ϕ(n):**ϕ(n) = (17-1) * (53-1) = 832。
- 选加密指数e: 我们通常选一个小素数,比如e = 3。(只要e 和 832 互质就行)。
- 公钥就是:(901, 3)。你可以把这对数字发给任何人。
- 算解密指数 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:
- 你只看到公钥 901 和密文 672。
- 你想解密,就必须算出 d。
- 要算出 d,你必须知道 ϕ(n)(即 832)。
- 要算出 832,你必须知道 901 是哪两个素数相乘的。
- 如果你无法分解 901,你就永远找不到那个解密指数 555。