本文最后更新于:2022年7月21日 下午
RSA加密算法
参考资料:
RSA算法原理(一) - 阮一峰的网络日志 (ruanyifeng.com)
RSA算法原理(二) - 阮一峰的网络日志 (ruanyifeng.com)
欧拉定理 (数论) - 维基百科,自由的百科全书 (wikipedia.org)
扩展欧几里德算法详解_zhj5chengfeng的博客-CSDN博客_扩展欧几里得算法
RSA是目前使用最广泛的公钥密码之一,安全性基于大整数因子分解的困难性,这篇博客是我学习RSA算法的笔记,总结结合了网上的资料。
原理
前置知识1:模运算
模运算(mod)即求余运算,a mod n就是a除以n得到的余数,例如8 mod 3=2。
若(a mod n)=(b mod n),则定义a,b模n同余,即a≡b (mod n),例如21≡11( mod 10)。同余有以下性质:
- 自反:a≡a (mod n)
- 对称:若a≡b (mod n),则b≡a (mod n)
- 传递:若a≡b (mod n)且b≡c (mod n),则a≡c (mod n)
- 幂:若a≡b (mod n),则am≡bm (mod n)
- 若a≡a1 (mod n)且b≡b1 (mod n),且c,d是任意整数,则ac+bd≡a1c+b1d,abcd≡a1b1cd。(同模下的式子可以互相加减乘,并且可以往≡两边加乘常数)
前置知识2:欧拉函数
欧拉函数ϕ(n)表示小于等于n的正整数中,与n构成互质关系的数的个数,例如ϕ(8)=4(分别是1 3 5 7)。
欧拉函数的计算方式:ϕ(n)=n(1−p11)(1−p21)...(1−pr1),其中pr是质数且∏pr=n(pr不重复)。例如ϕ(1323)=ϕ(33×77)=1323(1−31)(1−71)。
欧拉函数的一些计算性质:
- 若n可以分解为两个互质整数之积:n=p1×p2,则ϕ(n)=ϕ(p1)ϕ(p2)。
前置知识3:欧拉定理
若正整数a和n互质,则aϕ(n)≡1 (mod n)。例如a=3,n=5时ϕ(n)=4,34≡1 (mod 5)。
这个定理可以简化求大数幂的个位数,比如计算7222的各位数时,可看做求7222除以10的余数
- 因为7,10互质,所以7ϕ(10)≡1 (mod 10)。
- 所以7222=74×55+2=(74)55×72
- 所以(74)55≡155 (mod 10)
- 所以(74)55×72≡155×72 (mod 10)
- 所以也就是9。
前置知识4:模反元素/乘法逆元
若a,n互质,则必有b使ab≡1(mod n),此时b是a的模反元素或乘法逆元。
乘法逆元的直观作用:m是一个很大的数,现要计算c=m/a mod b,若d是a的乘法逆元ma≡1(mod n),则可用d代替计算:c=md mod b。
前置知识5:拓展欧几里得算法
欧几里得算法是求解a,b的最大公约数(记作gcd(a,b))的一种递归算法,也叫辗转相除法:gcd(a,b)=gcd(b,a mod b),一直到gcd参数有一个为0。
比如求14和45的最大公约数,即gcd(45,14)=gcd(14,3)=gcd(3,2)=gcd(2,1)=gcd(1,0)=1。
再比如求28和63的最大公约数,即gcd(63,28)=gcd(28,7)=gcd(7,0)=7。
我们已知a,b的最大公约数是gcd,那么一定会有x,y满足ax+by=gcd(a,b),而扩展欧几里得算法就是找到x,y的方法。
- 用
%
表示求余,用//
表示整除,假设上一步是gcd(a,b),下一步是gcd(b,a%b)
- 已知下一步的x,y满足bx+(a%b)y=gcd
- 代入a%b=a−(a//b)×b,得到bx+[a−(a//b)b]y=ay+b[x−(a//b)y]=gcd
- 此时可以发现上一步的x1=y,y1=x−(a//b)y。
- 也就是说,假设a>b,上一步是gcd(a,b)对应ax+by=1,下一步是gcd(b,a%b)对应ay′+b(x′−ky′)=1。
前置知识6:用拓展欧几里得计算乘法逆元
ab≡1(mod n)已知a,n求b,原式等价于ab−kn=1, k未知,而此时把b看作x,-k看作y,那么就是解一个拓展欧几里得的问题了。
RSA密钥生成
-
选择两个不相等质数p,q。(p=61,q=53)
-
n=p×q,n的二进制长度就是秘钥长度。n=(3233)
-
根据性质,计算ϕ(n)=(p−1)(q−1)。φ(n)=(3120)
-
选择整数e,满足1<e<ϕ(n),且e与ϕ(n)互质。假设选了1到3120之间的17
-
计算e对于ϕ(n)的模反元素d,即满足ed≡1(mod ϕ(n)),也即ed−1=k⋅ϕ(n)。
17d+3120k=1,用拓展欧几里得算法得到d=2753,k=-15
-
将n和e封装为公钥,n和d封装为私钥
这个算法保证了已知n和e,无法推出d。因为ed≡1(mod ϕ(n))需要知道ϕ(n),而ϕ(n)=(p−1)(q−1)需要知道p,q,而n=pq,当n很大的时候,就无法因数分解。
1 2
| p,q(不相等大质数) n(无法因数分解的大数) e(和n组成公钥)d(和n组成私钥)φ(n)(算出来的)
|
RSA加密
设明文为m,m是一个小于n的整数。计算c,使me≡c(mod n),则c为密文。
假如要加密m=65,则6517 mod 3233=2790=c。
RSA解密
拿到密文c之后,cd≡ m(mod n)。
27902753mod 3233=65。