跳到主要内容

RSA加密原理

· 阅读需 4 分钟

模运算

非对称加密解密所用到的一个非常重要的特性就是模运算不可逆

比如算 33 mod 73^3 \text{ } mod \text{ } 7 的值, 很容易算出余数为 27 - 21 = 6

但是知道 3x mod 7=63^{\color{green}{x}} \text{ } mod \text{ } 7 = 6, 然后求 xx 的值呢,那么就只能挨个去试了,但是如果式子中的数字稍微大那么一点,比如

520x mod 1011=721520^{\color{green}{x}} \text{ } mod \text{ } 1011 = 721

再挨个去试就很不现实了。

试想有3个数字, e,d,n{\color{green}{e}},{\color{red}{d}}, {\color{blue}{n}} 满足下面的条件

me mod n=cm^{\color{green}{e}} \text{ } mod \text{ } {\color{blue}{n}} = c cd mod n=mc^{\color{red}{d}} \text{ } mod \text{ } {\color{blue}{n}} = m

m 可以表示是要加密的信息,c 表示加密后的密文, 那么就可以通过这个规则对信息进行加解密了,其中

  • (e,n)({\color{green}{e}}, {\color{blue}{n}}) 用来当做 公钥
  • (d,n)({\color{red}{d}}, {\color{blue}{n}}) 用来当做 私钥

上面公式经过一些变化可以得到

med mod n=m{m^{\color{green}{e}{\color{red}{d}}} \text{ } mod \text{ } {\color{blue}{n}} = m}

如何选取这个 e{\color{green}{e}}d{\color{red}{d}} 便成了非对称加密中的最关键的问题, 这就提到了欧拉定理

欧拉函数

讲欧拉定理前,先说下什么是欧拉函数
对于正整数N, 欧拉函数 ϕ(n)\phi(n) 的值等于从 1 到 N 中与 N 互质的数的个数

互质: 如果两个整数它们的最大公约数为 1, 则这两个数互质。

比如

正整数 N与 N 互质的数欧拉函数值
2{1}ϕ(2)\phi(2) = 1
3{1, 2}ϕ(3)\phi(3) = 2
4{1, 3}ϕ(4)\phi(4) = 2
5{1, 2, 3, 4}ϕ(5)\phi(5) = 4
6{1, 5}ϕ(6)\phi(6) = 2
7{1, 2, 3, 4, 5, 6}ϕ(7)\phi(7) = 6

对于质数来说, 小于它的数都与它互质,所以对于质数 nn, 有 ϕ(n)=n1\phi(n) = n - 1

欧拉定理

对于互质的正整数 mmnn,则 mmϕ(n)\phi{(n)} 次方与11同余,模为 nn, 即

mϕ(n)1 (mod n)m^{\phi(n)} \equiv 1 \text{ } (mod\text{ }{n})

我们对公式进行一些简单的变换,等式两端同时取 kk 次幂, 即

(mϕ(n))k=1k (mod n)(m^{\phi(n)})^k = 1^k \text{ } (mod \text{ }n)

等同于

mkϕ(n)=1 (mod n)m^{k\phi(n)} = 1 \text{ } (mod \text{ }n)

两端同时乘以 mm

mkϕ(n)m=1m (mod n)m^{k\phi(n)} * m = 1 * m \text{ } (mod \text{ }n)

再简化

mkϕ(n)+1=m (mod n)m^{k\phi(n)+1} = m \text{ } (mod \text{ }n)

最后将模运算写在等式的左边

mkϕ(n)+1 mod n=mm^{k\phi(n)+1}\text{ } mod \text{ }n = m

然后和之前的加解密公式对应起来

med mod n=m{m^{\color{green}{e}{\color{red}{d}}} \text{ } mod \text{ } {\color{blue}{n}} = m}

我们可以将 d{\color{red}{d}}e{\color{green}{e}} 的关系表示成下面这种形式

ed=kϕ(n)+1{\color{green}{e}}{\color{red}{d}} = k\phi({\color{blue}{n}})+1

d=kϕ(n)+1e{\color{red}{d}} = \frac{k\phi({\color{blue}{n}})+1}{\color{green}{e}}

我们可以通过选取这里的 kkn\color{blue}{n}e\color{green}{e} 来计算用于解密的密钥 d\color{red}{d}

前面讲欧拉函数的时候我们讲到,对于互质的数,有 ϕ(n)=n1\phi(n) = n - 1 , 除此之外欧拉函数还有一个重要的特性,对于互质的 ppqq

ϕ(pq)=ϕ(p)ϕ(q)\phi(p * q) = \phi(p) * \phi(q)

我们选取 p=3,q=11p=3, q=11,因此 n=p×q=33{\color{blue}{n}} = p \times q = 33ϕ(n)=ϕ(3)×ϕ(11)=2×10=20\phi({\color{blue}{n}}) = \phi(3) \times \phi(11) = 2 \times 10 = 20

d=k×20+1e{\color{red}{d}} = \frac{k \times 20+1}{\color{green}{e}}

我们找一个与 2020 互质的较小的数 33 当做 e\color{green}{e}, 然后尝试找满足等式的 d{\color{red}{d}},当 k=1k=1的时候,存在 d=7{\color{red}{d}} = 7 满足条件,然后就可以把公钥 e=3,n=33{\color{green}{e}} = 3, {\color{blue}{n}} = 33 公布当做公钥,自己保留 d=7{\color{red}{d}} = 7 当做私钥。

至此就生成了不容易被破解非对称的密钥。