毕业设计(1):RSA密码与其数学原理

前言

什么是 RSA 算法及其数学原理。毕业设计笔记。

RSA 算法的步骤

这里先不加数学原理解释,直接给出 RSA 的基本工作步骤,如下。

密钥的生成

  1. 选择两个素数 ppqq

  2. n=p×qφ(n)=(p1)×(q1)n = p \times q \\ \varphi(n) = (p-1)\times(q-1)

  3. 求公钥:任意选择 ee 使得:

    {0<e<φ(n)gcd(φ(n),e)=1\left\{ \begin{aligned} &0<e<\varphi(n) \\ &gcd(\varphi(n),e)=1 \end{aligned} \right.

    ee 小于 φ(n)\varphi(n),且与 φ(n)\varphi(n) 互质;

  4. 求私钥:计算 dd,其满足 de1mod(φ(n))d\cdot e \equiv 1 \mod(\varphi(n))。或者说,de+cφ(n)=1d\cdot e+ c\cdot\varphi(n)=1,其中 cc 不确定,求 dd

  5. {e,n}为公钥,{d,n}为私钥,p,q丢弃。

发现自己连第四步中的 de+cφ(n)=1d\cdot e+ c\cdot\varphi(n)=1 都不会推了,简单记一下。

de1mod(φ(n))de1=kφ(n)de+cφ(n)=1\begin{aligned} d\cdot e &\equiv 1 \mod(\varphi(n))\\ d\cdot e-1&=k\cdot\varphi(n)\\ d\cdot e+ c\cdot\varphi(n)&= 1 \end{aligned}

加密

对于明文 m,密文为c:

cmemod(n)c\equiv m^e \mod(n)

也就是说,我们对 mm 进行幂运算同时进行模运算即可加密。

解密

对于密文 cc,明文 mm

mcdmod(n)m\equiv c^d \mod(n)

也就是说,我们对 cc 进行幂运算同时进行模运算即可解密。

RSA 的数学基础

乘法逆元与扩展欧几里得算法

裴蜀定理(不证)

裴蜀定理(Bézout's lemma)指出,关于 aabb 的方程:

ax+by=max+by=m

仅在 mmaabb 的最大公约数的倍数时,有整数解。

通过裴蜀定理,我们就可以把 gcd(a,b)\gcd(a,b) 转化成 ax+by=max+by=m。其中 m 是最大公因数的倍数。

特别地,当 m=1m=1,这个时候 x,yx,y 分别被叫做 aa关于模 bb 的模逆元 xxbb关于模 aa 的模逆元 yy

乘法逆元

ab1mod(n)ab\equiv 1 \mod(n)

a,ba,b 互为乘法逆元(模逆元、模倒数)。此时有:

ab+kn=1ab+kn=1

乘法逆元存在的充要条件是 a,na,n 互质,换句话说,右边的 1 其实是 gcd(a,n)gcd(a,n)。若 gcd(a,n)1gcd(a,n) \neq 1,那么 xx 就不是逆元。

求乘法逆元我们可以使用下面介绍的扩展欧几里得算法,在求 gcd(a,n)gcd(a,n) 的过程中,将逆元 bb 求出。

在 RSA 中,私钥 dd 实际上就是公钥 ee 的乘法逆元。

欧几里得算法与其证明

欧几里得算法即辗转相除法,用于求两个数的最大公因数。在密钥生成的第三步,我们可以用欧几里得算法检查 gcd(φ(n),e)gcd(\varphi(n),e) 是否为 1。其算法逻辑如下:

1
2
3
4
5
6
7
8
9
int gcd(int a, int b)
{
if (b == 0)
{
return a;
}
int d = gcd(b, a % b);
return d;
}

比较简单就只写代码了。

下面是该算法有效性的证明:

a>ba>b (否则,代码结果会等价于做一次交换): 在带余除法下,我们设

  • q=abq=\displaystyle\left\lfloor\frac{a}{b}\right\rfloor:商
  • r=amodbr=a\bmod b:余
  • d1=gcd(a,b)d_1=\gcd(a,b):最大公因数
  • d2=gcd(b,r)d_2=\gcd(b,r):与余的最大公因数

那么,对于 d1d_1

  1. 由于 bb 是最大公因数 d1d_1 的倍数,那么 qbqb 也是 d1d_1 的倍数;
  2. aa 是最大公因数 d1d_1 的倍数,那么 aqba-qb 也是 d1d_1 的倍数;
  3. r=aqbr=a-qb ,所以 rr 也是 d1d_1 的倍数。
  4. d1d_1同时为 bbrr 因数,即 d1d_1bbrr 的公因数。
  5. 由于 d2=gcd(b,r)d_2=\gcd(b,r) 数,根据性质“最大公因数是所有公因数的倍数”,可知 d1d_1d2d_2 的因数。

另一方面,对于 d2d_2

  1. 由于 bb 是最大公因数 d2d_2 的倍数,那么 qbqb 也是 d2d_2 的倍数;
  2. rr 是最大公因数 d2d_2 的倍数,那么 r+qbr+qb 也是 d2d_2 的倍数;
  3. 由于 a=qb+ra=qb+r ,所以 aa 也是 d2d_2 的倍数。
  4. 所以 d2d_2aabb 的公因数。
  5. 由于 d1=gcd(a,b)d_1=\gcd(a,b) ,根据性质“最大公因数是所有公因数的倍数”,所以 d2d_2d1d_1 的因数。

d1d_1d2d_2 的因数, d2d_2 也是 d1d_1 的因数,这说明 d1=d2d_1=d_2 ,即 gcd(a,b)=gcd(b,amodb)\gcd(a,b)=\gcd(b,a\bmod b) 。因此辗转相除法是正确的。

最大公因数是所有公因数的倍数的证明:

g=gcd(a,b)g= gcd(a,b)dd 是所有形如 ax+byax+by整数中最小的。

由于正整数 d=ax+by=xk1g+yk2g=g(xk1+yk2)>0d=ax+by=xk_1g+yk_2g=g(xk_1+yk_2)>0,那么 gg 整除 ddgdg\leqslant d

d=ax0+by0d=ax_0+by_0,用 dd 带余除任意形如 ax+byax+by 的数,设为 ax+by=dq+rax+by=dq+r,那么 r=ax+byd=a(xqx0)+b(yqy0)r=ax+by-d=a(x-qx_0)+b(y-qy_0)。即 rr 也是一个形如 ax+byax+by 的数。

由余数的定义,可知 0r<d0\leqslant r< d;若 r>0r>0 那么这与前述“dd 是所有形如 ax+byax+by 的正整数中最小的”相矛盾,所以 r=0r=0

即: dd 整除任意形如 ax+byax+by 的数。

因此,dd 整除 aabb,即 ddaabb的公因数。那么, dgd\leqslant g

综合 gdg\leqslant ddgd\leqslant gg=d=ax+byg=d=ax+by

可以看出 ax+byax+by 可以被 aabb 的每一个公因数整除,因此,最大公因数是所有公因数的倍数。

得证。

扩展欧几里得算法与其证明

欧拉函数与欧拉定理

欧拉函数

如果两个正整数,除了 1 以外,没有其他公因数,我们就称这两个数是互质关系。两个数互质,不说明两个数是质数。

给定一个数 nn,求出在小于 nn 的数中有多少个与 nn 互质,这就是欧拉函数 φ(n)\varphi (n)

在欧拉函数的第一步中,我们就计算了 nn 的欧拉函数值 φ(n)=(p1)(q1)\varphi (n)=(p-1)(q-1)

欧拉函数函数式的推导:

分情况讨论:

  1. n=1:φ(1)=1\varphi(1) =1。1 与任何数都互质。

  2. n 为质数:φ(n)=n1\varphi(n) =n-1。不难想到,互质的两个数中,若大的为质数,那么二者必然互质,因为质数只有两个因数。

  3. n=pk (k>0)n = p^k\ (k>0),即 nn 是一质数 pp 的某一次方幂:

    φ(n)=pkpk1=pk(11p)\begin{aligned} \varphi(n) &=p^k-p^{k-1}\\ &= p^k(1-\frac{1}{p}) \end{aligned}

    这是因为小于 pkp^k 的数中,1×p,2×ppk1×p1\times p,2\times p\dots p^{k-1}\times p 共计 pk1p^{k-1} 个数都有质数 pp 做因数,需要剔除。

    第二种情况是第三种情况的特殊情况。

  4. n=p1×p2n = p_1\times p_2,即 nn 是两互质整数的积:

    φ(n)=φ(p1)φ(p2)\varphi(n) =\varphi(p_1)\varphi(p_2)

    证明需要用到中国剩余定理。

  5. nn 是一般的正整数,通过质因数分解,其可以化为 n=p1k1p2k2p3k3pmkmn=p_1^{k_1}p_2^{k_2}p_3^{k_3}\dots p_m^{k_m}。那么有:

    φ(n)=φ(p1)φ(p2)φ(pm) (情况4)=p1k1p2k2pmkm×(11p1)(11p2)(11pm) (情况3)=n(11p1)(11p2)(11pm)\begin{aligned} \varphi(n) &= \varphi(p_1)\varphi(p_2)\cdots\varphi(p_m)\ (情况4)\\ &= p_1^{k_1}p_2^{k_2}\dots p_m^{k_m}\times(1-\frac{1}{p_1})(1-\frac{1}{p_2})\cdots(1-\frac{1}{p_m})\ (情况3)\\ &=n(1-\frac{1}{p_1})(1-\frac{1}{p_2})\cdots(1-\frac{1}{p_m}) \end{aligned}

欧拉定理(不证)

有了欧拉函数,我们可以有欧拉定理,对于互质的两个数 a,na,n

aφ(n)1mod(n)a^{\varphi(n)}\equiv 1\mod(n)

a,pa,p 互质,那么有

ap11mod(n)a^{p-1}\equiv 1\mod(n)

这就是费马小定理

欧拉定理这里不证。

RSA 的有效性证明

为什么 RSA 这样进行加密可以保证解密后一定是原文?下面给出证明。

根据【加密】一节,可以知道,密文 ccmem^e 之间差距为若干个 nn:

c=me+knc= m^e+kn

代入【解密】中的公式,有:

(me+kn)dmmod(n)(m^e+kn)^d\equiv m \mod(n)

左侧多项式展开后,所有含 knkn 的项都可被 nn 整除,不影响余数。于是等价为:

medmmod(n)m^{ed}\equiv m\mod(n)

根据【密钥生成】中第四步的公式 de+kφ(n)=1d\cdot e+ k\cdot\varphi(n)=1 (为避免歧义,将 φ(n)\varphi(n) 的系数换了字母)代换:

m1kφ(n)mmod(n)    mmφ(n)kmmod(n)\begin{aligned} m^{1-k\varphi (n)}&\equiv m\mod(n)\\ \implies m\cdot {m^{\varphi (n)}}^{-k}&\equiv m\mod(n) \end{aligned}

此时分情况讨论:

  1. m,nm,n 互质,根据欧拉定理就有 mφ(n)1mod(n)m^{\varphi(n)}\equiv 1\mod(n),将 mφ(n)m^{\varphi(n)} 代入就得证。

  2. m,nm,n 不互质。而 nn 是两大素数的乘积,那么 mm 的因子中必然有 p,qp,q 中的一个而与另一个互质。假设 m,nm,n 公因子为 ppmmqq 互质,有:

    两个素数不可能同时为公因子,这意味着 mm 不小于 nn,那么就无法正确【解密】了。

    根据费马小定理:

    mφ(q)1mod(q)m^{\varphi(q)}\equiv 1\mod(q)

    于是根据欧拉函数以及前面提到的 de+kφ(n)=1d\cdot e+ k\cdot\varphi(n)=1 推出:

    mφ(q)1mod(q)mq11mod(q)(mq1)k(p1)1mod(q)mkφ(n)1mod(q)med11mod(q)\begin{aligned} m^{\varphi(q)}&\equiv 1\mod(q)\\ m^{q-1}&\equiv 1\mod(q)\\ {(m^{q-1})}^{-k(p-1)}&\equiv 1\mod(q)\\ {m^{-k\varphi(n)}}&\equiv 1\mod(q)\\ m^{ed-1}&\equiv 1\mod(q)\\ \end{aligned}

    于是设

    m=rpmed1=tq+1m = r\cdot p\\ m^{ed-1}=t\cdot q+1

    那么

    med1=tq+1med=tqm+mmed=tq(rp)+mmed=trpq+mmed=trn+m    medmmod(n)\begin{aligned} m^{ed-1}&= tq+1\\ m^{ed}&= tq\cdot m+m\\ m^{ed}&= tq\cdot (r\cdot p)+m\\ m^{ed}&= tr\cdot pq+m\\ m^{ed}&= tr\cdot n+m\\ \implies m^{ed}&\equiv m \mod(n)\\ \end{aligned}

    得证。