跳转至

RSA加解密示例

示例1

1. 密钥生成步骤

  1. 选择素数:令 \(p = 3, q = 11\)
  2. 计算模数\(n = p \times q = 33\)
  3. 计算欧拉函数\(\phi(n) = (3-1) \times (11-1) = 2 \times 10 = 20\)
  4. 选择公钥指数 \(e\):我们需要一个与 20 互质的数,选 \(e = 3\)
  5. 计算私钥指数 \(d\):需满足 \(3d \equiv 1 \pmod{20}\)
  6. 通过试算:\(3 \times 7 = 21\),而 \(21 \div 20\)\(1\)
  7. 所以 \(d = 7\)

结果:

  • 公钥\((n=33, e=3)\)
  • 私钥\((n=33, d=7)\)

2. 加密演示

假设我们要发送的消息明文 \(M = 5\)

\[C = M^e \pmod{n}\]
\[C = 5^3 \pmod{33} = 125 \pmod{33}\]

计算 \(125 \div 33 = 3\)\(26\),所以 密文 \(C = 26\)

3. 解密演示

接收方收到密文 \(26\),使用私钥 \(d=7\) 进行还原:

\[M = C^d \pmod{n}\]
\[M = 26^7 \pmod{33}\]

为了计算方便,我们可以拆解幂运算:

  • \(26^1 \equiv 26 \equiv -7 \pmod{33}\)
  • \(26^2 \equiv (-7)^2 = 49 \equiv 16 \pmod{33}\)
  • \(26^4 \equiv 16^2 = 256 \equiv 25 \pmod{33}\)
  • \(26^7 = 26^4 \times 26^2 \times 26^1 \equiv 25 \times 16 \times (-7) \pmod{33}\)
  • 计算得出结果为 \(5\)

明文还原成功!

示例2

取: $$ p=61,\quad q=53 $$ 则: $$ n = 61 \cdot 53 = 3233 $$ 计算: $$ \lambda(n)=\operatorname{lcm}(60,52)=780 $$ 选: $$ e=17 $$ 求逆得到: $$ d=413 $$ 公钥: \((n=3233, e=17)\) 私钥: \(d=413\)

加密 \(m=65\): $$ c = 65^{17} \bmod 3233 = 2790 $$ 解密: $$ m = 2790^{413} \bmod 3233 = 65 $$

基于中国剩余定理(CRT)的加速

为提升解密效率,实际私钥通常还包含: $$ d_p = d \bmod (p-1),\quad
d_q = d \bmod (q-1),\quad
q^{-1} \bmod p $$ 先分别计算: $$ m_1 = c^{d_p} \bmod p,\quad
m_2 = c^{d_q} \bmod q $$ 再用中国剩余定理合成得到最终 \(m\)

该方法可使解密速度提升约 4 倍

RSA数字签名

签名

Alice 对消息 \(M\)

  1. 计算哈希: $$ h = \text{hash}(M) $$

  2. 生成签名: $$ s = h^d \bmod n $$

  3. 发送 \((M, s)\) 给 Bob。


验证

Bob 计算: $$ h = \text{hash}(M) $$ 并检查: $$ s^e \stackrel{?}{\equiv} h \pmod n $$ 若成立,则:

  • 消息确实来自 Alice;
  • 消息未被篡改。

数学依据: $$ s^e = (hd)e = h^{de} \equiv h \pmod n $$


为什么必须先做哈希?

若直接签名原始消息 \(m\),则存在可乘法伪造的漏洞:

  • 可伪造 \((m_1 m_2, s_1 s_2)\)
  • 可对 \(m=1\) 伪造签名 \(s=1\)

因此**现代 RSA 签名必须先哈希,再签名**(如 RSA-PSS)。