RSA数学原理解析
1.引言
RSA算法(RSA algorithm)是一种非对称加密算法, 广泛应用在互联网和电子商务中. 它使用一对密钥进行加密和解密, 分别称为公钥(public key)和私钥(private key). 使用公钥加密的内容只能用私钥解密, 使用私钥加密的内容只能用公钥解密, 并且不能通过公钥在可行的时间内计算出私钥. 这使得加密通信不需要交换私钥, 保证了通信的安全. 那么它是怎么做到这一点的呢? 背后有哪些数学原理? 这篇文章我们来讨论这个问题.
本文会先介绍RSA算法中用到的数论概念和定理: 模算术, 最大公约数与贝祖定理, 线性同余方程, 中国余数定理, 费马小定理; 然后再介绍RSA算法的原理, 并证明其是有效的. 本文会假设你了解数论的基本概念, 如素数, 最大公约数, 互素等
2.模算术
2.1整数除法
用一个正整数去除一个整数,可以得到一个商和一个余数,数学符号定义为:
定理1:令 a 为整数, d 为正整数, 则存在唯一的整数 q 和 r, 满足 $0\leq r<d$, 使得 $a=dq+r$
当r=0时,我们称 d 整除 a, 记作$d|a$; 否则称 d 不整除 a, 记作 $d\nmid a$,整除有以下基本性质:
定理2:令a,b,c,为整数,其中$a\neq0$,则:如果$a|b$且$a|c$则$a|(a+b)$
2.2模算术
在数论中我们特别关心一个整数被一个正整数除时的余数. 我们用 $a\bmod m=b$ 表示整数 a 除以正整数 m 的余数是 b. 为了表示两个整数被一个正整数除时的余数相同, 人们又提出了同余式(congruence).
定义1:如果 a 和 b 是整数而 m 是正整数, 则当 m 整除 a - b 时称 a 模 m 同余 b. 记作 $a\equiv b(\bmod m)$
$a\equiv b(\bmod m)$ 和 $a\bmod m=b$很相似. 事实上, 如果 $a\bmod m=b$, 则 $a\equiv b(\bmod m)$. 但他们本质上是两个不同的概念.$a\bmod m=b$ 表达的是一个函数, 而 $a\equiv b(\bmod m)$ 表达的是两个整数之间的关系.
另外,同余式$a\equiv b(\bmod m)$还可以表示为$m|(b-a)$,同时符合上式的式子可以转化为同余式
模算术的性质:
定理3:如果m是正整数,a,b是整数,则有
$$
\begin{aligned}
(a+b)\bmod m &=((a\bmod m)+(b\bmod m))\bmod m\
ab\bmod m &=(a\bmod m)(b\bmod m)\bmod m
\end{aligned}
$$
根据定理3,可得一下推论
推论1:设m是正整数,a,b,c是整数;如果$a\equiv b(\bmod m)$则$ac\equiv bc(\bmod m)$
证明:
$\because a\equiv b(\bmod m)$
$\therefore m|(b-a)$ 所以右端再乘以任何整数m都可以整除
即$m|(b-a)c$ 同理,既然$m|(b-a)$且$c|c$
也可以推出$mc|(b-a)c$
结论:若$a\equiv b(\bmod m)$,则$ac\equiv bc(\bmod m)$且$ac\equiv bc(\bmod mc)$同时成立
推论2设 m 是正整数, a, b 是整数, c 是不能被 m 整除的整数; 如果 $ac\equiv bc(\bmod m)$, 则$a\equiv b(\bmod m)$,依据推论1的证明,也是显而易见的。
3.最大公约数
如果一个整数 d 能够整除另一个整数 a, 则称 d 是 a 的一个约数(divisor); 如果 d 既能整除 a 又能整除 b, 则称 d 是 a 和 b 的一个公约数(common divisor). 能整除两个整数的最大整数称为这两个整数的最大公约数(greatest common divisor).
定义2:令a和b是不全为0的两个整数,能使$d|a$和$d|b$的最大整数d成为a和b的最大公约数,记作$gcd(a,b)$
3.1 求最大公约数
如何求两个已知整数的最大公约数呢? 这里我们讨论一个高效的求最大公约数的算法, 称为辗转相除法. 因为这个算法是欧几里得发明的, 所以也称为欧几里得算法. 辗转相除法基于以下定理:
引理 1 令 $a=bq+r$, 其中 a, b, q 和 r 均为整数. 则有$gcd(a,b)=gcd(b,r)$
证明:我们假设 d 是 a 和 b 的公约数, 即 $d|a$且 $d|b$, 那么根据定理2, d 也能整除 $a-bq=r$. 所以 a 和 b 的任何公约数也是 b 和 r 的公约数;
类似地, 假设 d 是 b 和 r 的公约数, 即 $d|b$且 $d|r$, 那么根据定理2, d 也能整除 $a=bq+r$.. 所以 b 和 r 的任何公约数也是 a 和 b 的公约数;
因此, a 与 b 和 b 与 r 拥有相同的公约数. 所以 $gcd(a,b)=gcd(b,r)$
辗转相除法就是利用引理1, 把大数转换成小数. 例如, 求 $gcd(287,91)$, 我们就把用较大的数除以较小的数. 首先用 287 除以 91, 得
$$
287=91\cdot3+14
$$
我们有$gcd(287,91)=gcd(91,14)$,问题转化成求$gcd(91,14)$,同样的,用91除以14得
$$
91=14\cdot6+7
$$
有$gcd(91,14)=gcd(14,7)$,用14除以7得
$$
14=7\cdot2+0
$$
所以$gcd(297,91)=gcd(91,14)=gcd(14,7)=7$
代码是这样的(两个都可以)
1 | def gcd(a,b): |
3.2 贝祖定理
现在我们讨论最大公约数的一个重要性质:
定理 4 贝祖定理 如果整数 a, b 不全为零, 则 $gcd(a,b)$是 a 和 b 的线性组合集$ax+by|x,y\in Z$ 中最小的元素. 这里的 x 和 y 被称为贝祖系数
证明 令 $A=ax+by|x,y\in Z$ 设存在 $x_0$ ,$y_0$ 使 $d_0$ 是 A 中的最小正元素, $d_0=ax_0+by_0$; 现在用 $d_0$去除 a, 这就得到唯一的整数 q(商) 和 r(余数) 满足
$$
\begin{aligned}
d_0q+r &= a \qquad 0\leq r<d_0\
(ax_0+by_0)q+r&=a\
r&=a-aqx_0-bqy_0\
r&=a(1-qx_0)+b(-qy_0)\in A
\end{aligned}
$$
又$0\leq r <d_0$,$d_0$是A中最小的正元素
$\therefore r=0,d|a$
同理, 用 $d_0$去除 b, 可得 $d_0|b$. 所以说 $d_0$ 是 a 和 b 的公约数.
设 a 和 b 的最大公约数是 d, 那么$d|(ax_0+by_0)$即 $d|d_0$
$\therefore d_0$是a和b的最大公约数
我们可以对辗转相除法稍作修改, 让它在计算出最大公约数的同时计算出贝祖系数.
1 | def gcd_new_2(a,b): |
大家是否还记得辗转相除法:我们换一个步骤多一点的例子$gcd(963,657)$
$$
\begin{aligned}
963&=1\cdot657+306 \qquad\qquad&9&=7\cdot657-15\cdot(963-657)=22\cdot657-15\cdot963 \
657&=2\cdot306+45 &9&=7\cdot(657-2\cdot306)-306=7\cdot657-15\cdot963 \
306&=6\cdot45+36 &9&=45-(306-6\cdot45)=7\cdot45-306\
45 &=1\cdot36+9 &9&=45-36\
36 &=4\cdot9
\end{aligned}
$$
$gcd(963,657)=9=22\cdot657-15\cdot963,x_0=-15,y_0=22$就是二元一次方程$963x+657y=9$的一组解且是$963x+657y$方程的正整数中的最小解。
4.线性同余方程
现在我们来讨论求解形如 $ax\equiv b(\bmod m)$ 的线性同余方程. 求解这样的线性同余方程是数论研究及其应用中的一项基本任务. 如何求解这样的方程呢? 我们要介绍的一个方法是通过求使得方程 $\overline{a}a\equiv 1(\bmod m)$ 成立的整数 $\overline{a}$. 我们称 $\overline{a}$为 a 模 m 的逆. 下面的定理指出, 当 a 和 m 互素时, a 模 m 的逆必然存在.
定理5:如果 a 和 m 为互素的整数且 $m>1$, 则 a 模 m 的逆存在, 并且是唯一的.
证明 由贝祖定理可知, $\because gcd(a,m)=1$ , ∴ 存在整数 x 和 y 使得
$$
ax+my=1
$$
这蕴含着
$$
ax+my\equiv 1(\bmod m)\
\because my\equiv0(\bmod m),所以有\
ax\equiv 1(\bmod m)\
\therefore x为a模的逆
$$
这样我们就可以调用辗转相除法 gcd(a, m) 求得 a 模 m 的逆.
求得了 a 模 m 的逆 �¯, 现在我们可以来解线性同余方程了. 具体的做法是这样的: 对于方程$ax\equiv b( \bmod m)$同时乘以$\overline{a}$得,
$$
\overline{a}ax\equiv \overline{a}b(\bmod m)
$$
$把\overline{a}a\equiv 1(\bmod m )代入上式,得\$
$$
x\equiv \overline{a}b(\bmod m)
$$
$x\equiv \overline{a}b(\bmod m)$就是方程的解,注意同余方程会有无数个W整数解, 所以我们用同余式来表示同余方程的解.
例1:求$34x\equiv 77(\bmod 89)$
解调用$gcd(34,89)$,得$gcd(34,89)=1=13_89-34_34$,所以34模89的逆为-34,方程两边同时乘 -34 得
$$
\begin{aligned}
-34\cdot34x&\equiv-34\cdot77(\bmod89)\
x&\equiv-34\cdot77(\bmod89)\
x&\equiv-2618\equiv52(\bmod89)
\end{aligned}
$$
5.中国剩余定理
中国南北朝时期数学著作 孙子算经 中提出了这样一个问题:
有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
用现代的数学语言表述就是: 下列同余方程组的解释多少?
$$
\begin{cases}
x\equiv2(\bmod3)\
x\equiv3(\bmod5)\
x\equiv2(\bmod7)\
\end{cases}
$$
孙子算经 中首次提到了同余方程组问题及其具体解法. 因此中国剩余定理称为孙子定理.
定理 6 中国余数定理 令 $m_1,m_2,…..,m_n$为大于 1 且两两互素的正整数, $a_1,a_2,….a_n$ 是任意整数. 则同余方程组
$$
\begin{cases}
x\equiv a_1(\bmod m_1)\
x\equiv a_2(\bmod m_2)\
…..\
x\equiv a_n(\bmod m_n)\
\end{cases}
$$
有唯一的模$m=m_1m_2….m_n$的解
证明:我们使用构造证明法, 构造出这个方程组的解. 首先对于 $i=1,2,….,n$, 令
$$
M_i=\frac{m}{m_i}
$$
即,$M_i$ 是除了$m_i$ 之外所有模数的积.$\because m_1,m_2….m_n$两两互素, $\therefore gcd(m_i,M_i)=1$ 由定理5 可知, 存在整数 $y_i$ 是 $M_i$模$m_i$的逆. 即
$$
M_iy_i\equiv1(\bmod m_i)
$$
同时乘以$a_i$得
$$
a_iM_iy_i\equiv a_i(\bmod m_i)
$$
就是第 i 个方程的一个解; 那么怎么构造出方程组的解呢? 我们注意到, 根据 $M_i$ 的定义可得, 对所有的 $j\neq i$, 都有 $a_iM_iy_i\equiv0(\bmod m_j)$. 因此我们令
$$
x=a_1M_1y_1+a_2M_2y_2+….+a_nM_ny_n=\sum_{i=1}^{n}{a_iM_iy_i}
$$
有了这个结论, 我们可以解答 孙子算经 中的问题了: 对方程组的每个方程, 求出 $M_i$ , 然后调用 gcd(M_i, m_i) 求出 $y_i$:
$$
\begin{cases}
\begin{aligned}
&x\equiv2(\bmod3)\quad &M_1&=35\quad y_1=-1\
&x\equiv3(\bmod5)\quad &M_2&=21\quad y_2=1\
&x\equiv2(\bmod7)\quad &M_3&=15\quad y_3=-1\
\end{aligned}
\end{cases}
$$
最后求出$x=-2_35+3_21+2*15=23\equiv23(\bmod 105)$
6.费马小定理
现在我们来看数论中另外一个重要的定理, 费马小定理(Fermat’s little theorem)
定理7费马小定理:如果a是一个整数,p是一个素数,那么
$$
a^p\equiv a(\bmod p)
$$
特别的当a不是p的倍数时(即$gcd(a,p)=1$),有
$$
a^{p-1}\equiv1(\bmod p)\
$$
7欧拉函数
再来看一看欧拉函数的知识。对于正整数n,欧拉函数$\varphi(n)$是小于或等于n的正整数中与n互质的数的数目
如$\varphi(8)=4$,1,3,5,7均与8互质
定理8:n,m为整数,$(n,m)=1$,如果$a_1,a_2,….a_n$和$b_1,b_2,….b_n$分别是模n,m的一个完整系,则有形如$nb_i+ma_j(1\leq i\leq s,1\leq j\leq t)$的数构成模mn的一个完整缩系,特别地有$\varphi(nm)=\varphi(n)\varphi(m)$
定理9:当n$\geq2$时,设$n=p_1^{e_1}….p_s^{e_s}$是n的标准分解式,则
$$
\varphi(n)=\prod_{l=1}^{s}(p_l^{e_l}-p_l^{e_l-1})=n\prod_{l=1}^{s}(1-\frac{1}{p})
$$
证明:当$(n.m)=1$时
$$
\varphi(n,m)=\varphi(n)\varphi(m)
$$
当$n_1,n_2……n_s$两两互素时
$$
\varphi(\prod_{l=1}^{s}n_l)=\prod_{l=1}^{s}n_l
$$
因此
$$
\varphi(n)=\prod_{l=1}^{s}\varphi(p_l^{e_l})
$$
问题转化成如何求$\varphi(p_l^{e_l})$,其中$p_l$要么$p_l|a$,要么$(p_l,a)=1$。在1,2….$p_l$当中可以被$p_l$整除的整数共有$\frac{p_l^{e_l}}{p_l}=p_l^{e_l-1}$个,故其中与$p_l^{e_l}$互素的个数共有$p_l^{e_l}-p_l^{e_l-1}$个,于是
$$
\varphi(p_l^{e_l})=p_l^{e_l}-p_l^{e_l-1}
$$
这样一来
$$
\varphi(n)=\prod_{l=1}^{s}(p_l^{e_l}-p_l^{e_l-1})=\prod_{l=1}^{s}p_l^{e_l}(1-\frac{1}{p_l})=n\prod_{l=1}^{s}(1-\frac{1}{p})
$$
其中若p为素数,则
$$
\varphi(p)=p-1=p(1-\frac{1}{p})
$$
8.RSA算法
我们终于可以来看 RSA 算法了. 先来看 RSA 算法是怎么运作的:
RSA 算法按照以下过程创建公钥和私钥:
- 1.随机算取两个大素数p和q,$p\neq q$
- 2.计算$n=pq$
- 3.选取一个与$(p-1)(q-1)$互素的小整数e
- 4.求e模$(p-1)(q-1)$的逆,记作d,即$de\equiv 1\bmod(p-1)(q-1)$
- 5.将$P=(e,n)$公开,是公钥。
- 6.将$S=(d,n)$保密,作为私钥 想
要把明文$M $加密成密文$C$,计算
$$
C=M^e\bmod n
$$
要把密文解密成明文$C$$M $,计算
$$
M=C^d \bmod n
$$
下面证明RSA算法是有效的:
证明:要证明其有效性,只需要证明$C\equiv M^e\bmod n$也就是$M^{ed}\equiv M(\bmod n)$,注意到d为e模$(p-1)(1-1)$的逆,所以有
$$
ed\equiv 1(\bmod(p-1)(q-1))
$$