前言
什么是 RSA 算法及其数学原理。毕业设计笔记。
RSA 算法的步骤
这里先不加数学原理解释,直接给出 RSA 的基本工作步骤,如下。
密钥的生成
-
选择两个素数 p,q;
-
记
n=p×qφ(n)=(p−1)×(q−1)
-
求公钥:任意选择 e 使得:
{0<e<φ(n)gcd(φ(n),e)=1
即 e 小于 φ(n),且与 φ(n) 互质;
-
求私钥:计算 d,其满足 d⋅e≡1mod(φ(n))。或者说,d⋅e+c⋅φ(n)=1,其中 c 不确定,求 d;
-
{e,n}为公钥,{d,n}为私钥,p,q丢弃。
发现自己连第四步中的 d⋅e+c⋅φ(n)=1 都不会推了,简单记一下。
d⋅ed⋅e−1d⋅e+c⋅φ(n)≡1mod(φ(n))=k⋅φ(n)=1
加密
对于明文 m,密文为c:
c≡memod(n)
也就是说,我们对 m 进行幂运算同时进行模运算即可加密。
解密
对于密文 c,明文 m:
m≡cdmod(n)
也就是说,我们对 c 进行幂运算同时进行模运算即可解密。
RSA 的数学基础
乘法逆元与扩展欧几里得算法
裴蜀定理(不证)
裴蜀定理(Bézout’s lemma)指出,关于 a,b 的方程:
ax+by=m
仅在 m 为 a,b 的最大公约数的倍数时,有整数解。
通过裴蜀定理,我们就可以把 gcd(a,b) 转化成 ax+by=m。其中 m 是最大公因数的倍数。
特别地,当 m=1,这个时候 x,y 分别被叫做 a关于模 b 的模逆元 x 和 b关于模 a 的模逆元 y。
乘法逆元
ab≡1mod(n)
则 a,b 互为乘法逆元(模逆元、模倒数)。此时有:
ab+kn=1
乘法逆元存在的充要条件是 a,n 互质,换句话说,右边的 1 其实是 gcd(a,n)。若 gcd(a,n)=1,那么 x 就不是逆元。
求乘法逆元我们可以使用下面介绍的扩展欧几里得算法,在求 gcd(a,n) 的过程中,将逆元 b 求出。
在 RSA 中,私钥 d 实际上就是公钥 e 的乘法逆元。
欧几里得算法与其证明
欧几里得算法即辗转相除法,用于求两个数的最大公因数。在密钥生成的第三步,我们可以用欧几里得算法检查 gcd(φ(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>b (否则,代码结果会等价于做一次交换):
在带余除法下,我们设
- q=⌊ba⌋:商
- r=amodb:余
- d1=gcd(a,b):最大公因数
- d2=gcd(b,r):与余的最大公因数
那么,对于 d1:
- 由于 b 是最大公因数 d1 的倍数,那么 qb 也是 d1 的倍数;
- 又 a 是最大公因数 d1 的倍数,那么 a−qb 也是 d1 的倍数;
- 又 r=a−qb ,所以 r 也是 d1 的倍数。
- d1同时为 b 和 r 因数,即 d1 是 b 和 r 的公因数。
- 由于 d2=gcd(b,r) 数,根据性质“最大公因数是所有公因数的倍数”,可知 d1 是 d2 的因数。
另一方面,对于 d2:
- 由于 b 是最大公因数 d2 的倍数,那么 qb 也是 d2 的倍数;
- 又 r 是最大公因数 d2 的倍数,那么 r+qb 也是 d2 的倍数;
- 由于 a=qb+r ,所以 a 也是 d2 的倍数。
- 所以 d2 是 a 和 b 的公因数。
- 由于 d1=gcd(a,b) ,根据性质“最大公因数是所有公因数的倍数”,所以 d2 是 d1 的因数。
d1 是 d2 的因数, d2 也是 d1 的因数,这说明 d1=d2 ,即 gcd(a,b)=gcd(b,amodb) 。因此辗转相除法是正确的。
最大公因数是所有公因数的倍数的证明:
设 g=gcd(a,b),d 是所有形如 ax+by 的正整数中最小的。
由于正整数 d=ax+by=xk1g+yk2g=g(xk1+yk2)>0,那么 g 整除 d 且 g⩽d;
设 d=ax0+by0,用 d 带余除任意形如 ax+by 的数,设为 ax+by=dq+r,那么 r=ax+by−d=a(x−qx0)+b(y−qy0)。即 r 也是一个形如 ax+by 的数。
由余数的定义,可知 0⩽r<d;若 r>0 那么这与前述“d 是所有形如 ax+by 的正整数中最小的”相矛盾,所以 r=0。
即: d 整除任意形如 ax+by 的数。
因此,d 整除 a,b,即 d 是 a,b的公因数。那么, d⩽g。
综合 g⩽d 和 d⩽g 有 g=d=ax+by。
可以看出 ax+by 可以被 a,b 的每一个公因数整除,因此,最大公因数是所有公因数的倍数。
得证。
扩展欧几里得算法与其证明
欧拉函数与欧拉定理
欧拉函数
如果两个正整数,除了 1 以外,没有其他公因数,我们就称这两个数是互质关系。两个数互质,不说明两个数是质数。
给定一个数 n,求出在小于 n 的数中有多少个与 n 互质,这就是欧拉函数 φ(n)。
在欧拉函数的第一步中,我们就计算了 n 的欧拉函数值 φ(n)=(p−1)(q−1)。
欧拉函数函数式的推导:
分情况讨论:
-
n=1:φ(1)=1。1 与任何数都互质。
-
n 为质数:φ(n)=n−1。不难想到,互质的两个数中,若大的为质数,那么二者必然互质,因为质数只有两个因数。
-
n=pk (k>0),即 n 是一质数 p 的某一次方幂:
φ(n)=pk−pk−1=pk(1−p1)
这是因为小于 pk 的数中,1×p,2×p…pk−1×p 共计 pk−1 个数都有质数 p 做因数,需要剔除。
第二种情况是第三种情况的特殊情况。
-
n=p1×p2,即 n 是两互质整数的积:
φ(n)=φ(p1)φ(p2)
证明需要用到中国剩余定理。
-
n 是一般的正整数,通过质因数分解,其可以化为 n=p1k1p2k2p3k3…pmkm。那么有:
φ(n)=φ(p1)φ(p2)⋯φ(pm) (情况4)=p1k1p2k2…pmkm×(1−p11)(1−p21)⋯(1−pm1) (情况3)=n(1−p11)(1−p21)⋯(1−pm1)
欧拉定理(不证)
有了欧拉函数,我们可以有欧拉定理,对于互质的两个数 a,n:
aφ(n)≡1mod(n)
若 a,p 互质,那么有
ap−1≡1mod(n)
这就是费马小定理
欧拉定理这里不证。
RSA 的有效性证明
为什么 RSA 这样进行加密可以保证解密后一定是原文?下面给出证明。
根据【加密】一节,可以知道,密文 c 和me 之间差距为若干个 n:
c=me+kn
代入【解密】中的公式,有:
(me+kn)d≡mmod(n)
左侧多项式展开后,所有含 kn 的项都可被 n 整除,不影响余数。于是等价为:
med≡mmod(n)
根据【密钥生成】中第四步的公式 d⋅e+k⋅φ(n)=1 (为避免歧义,将 φ(n) 的系数换了字母)代换:
m1−kφ(n)⟹m⋅mφ(n)−k≡mmod(n)≡mmod(n)
此时分情况讨论:
-
m,n 互质,根据欧拉定理就有 mφ(n)≡1mod(n),将 mφ(n) 代入就得证。
-
m,n 不互质。而 n 是两大素数的乘积,那么 m 的因子中必然有 p,q 中的一个而与另一个互质。假设 m,n 公因子为 p,m 与 q 互质,有:
两个素数不可能同时为公因子,这意味着 m 不小于 n,那么就无法正确【解密】了。
根据费马小定理:
mφ(q)≡1mod(q)
于是根据欧拉函数以及前面提到的 d⋅e+k⋅φ(n)=1 推出:
mφ(q)mq−1(mq−1)−k(p−1)m−kφ(n)med−1≡1mod(q)≡1mod(q)≡1mod(q)≡1mod(q)≡1mod(q)
于是设
m=r⋅pmed−1=t⋅q+1
那么
med−1medmedmedmed⟹med=tq+1=tq⋅m+m=tq⋅(r⋅p)+m=tr⋅pq+m=tr⋅n+m≡mmod(n)
得证。