RSA加密算法

本文最后更新于:2022年7月21日 下午

RSA加密算法

参考资料:

RSA算法原理(一) - 阮一峰的网络日志 (ruanyifeng.com)

RSA算法原理(二) - 阮一峰的网络日志 (ruanyifeng.com)

欧拉定理 (数论) - 维基百科,自由的百科全书 (wikipedia.org)

扩展欧几里德算法详解_zhj5chengfeng的博客-CSDN博客_扩展欧几里得算法

RSA是目前使用最广泛的公钥密码之一,安全性基于大整数因子分解的困难性,这篇博客是我学习RSA算法的笔记,总结结合了网上的资料。

原理

前置知识1:模运算

模运算(mod)即求余运算,a mod na\ mod\ n就是a除以n得到的余数,例如8 mod 3=28\ mod\ 3 = 2

(a mod n)=(b mod n)(a\ mod\ n) = (b\ mod\ n),则定义a,b模n同余,即ab (mod n)a\equiv b\ (mod\ n),例如2111( mod 10)21\equiv 11(\ mod \ 10)。同余有以下性质:

  • 自反:aa (mod n)a\equiv a\ (mod\ n)
  • 对称:若ab (mod n)a\equiv b\ (mod\ n),则ba (mod n)b\equiv a\ (mod\ n)
  • 传递:若ab (mod n)a\equiv b\ (mod\ n)bc (mod n)b\equiv c\ (mod\ n),则ac (mod n)a\equiv c\ (mod\ n)
  • 幂:若ab (mod n)a\equiv b\ (mod\ n),则ambm (mod n)a^m \equiv b^m\ (mod\ n)
  • aa1 (mod n)a\equiv a_1\ (mod\ n)bb1 (mod n)b\equiv b_1\ (mod\ n),且c,dc,d是任意整数,则ac+bda1c+b1dac+bd \equiv a_1c+b_1dabcda1b1cdabcd\equiv a_1b_1cd。(同模下的式子可以互相加减乘,并且可以往\equiv两边加乘常数)

前置知识2:欧拉函数

欧拉函数ϕ(n)\phi(n)表示小于等于nn的正整数中,与nn构成互质关系的数的个数,例如ϕ(8)=4\phi(8)=4(分别是1 3 5 7)。

欧拉函数的计算方式:ϕ(n)=n(11p1)(11p2)...(11pr)\phi(n)=n(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_r}),其中prp_r是质数且pr=n\prod p_r=nprp_r不重复)。例如ϕ(1323)=ϕ(33×77)=1323(113)(117)\phi(1323)=\phi(3^3\times7^7)=1323(1-\frac{1}{3})(1-\frac{1}{7})

欧拉函数的一些计算性质:

  • 若n可以分解为两个互质整数之积:n=p1×p2n=p_1\times p_2,则ϕ(n)=ϕ(p1)ϕ(p2)\phi(n)=\phi(p_1)\phi(p_2)

前置知识3:欧拉定理

若正整数aann互质,则aϕ(n)1 (mod n)a^{\phi(n)}\equiv 1\ (mod\ n)。例如a=3,n=5ϕ(n)=4,341 (mod 5)a=3,n=5时\phi(n)=4,3^4\equiv1\ (mod\ 5)

这个定理可以简化求大数幂的个位数,比如计算72227^{222}的各位数时,可看做求72227^{222}除以10的余数

  • 因为7,10互质,所以7ϕ(10)1 (mod 10)7^{\phi(10)}\equiv 1\ (mod\ 10)
  • 所以7222=74×55+2=(74)55×727^{222}=7^{4\times55+2}=(7^4)^{55}\times 7^2
  • 所以(74)55155 (mod 10)(7^4)^{55} \equiv 1^{55}\ (mod\ 10)
  • 所以(74)55×72155×72 (mod 10)(7^4)^{55}\times 7^2 \equiv 1^{55}\times7^2\ (mod\ 10)
  • 所以也就是99

前置知识4:模反元素/乘法逆元

a,na,n互质,则必有bb使ab1(mod n)ab\equiv 1(mod\ n),此时bbaa的模反元素或乘法逆元。

乘法逆元的直观作用:mm是一个很大的数,现要计算c=m/a mod bc=m/a\ mod\ b,若ddaa的乘法逆元ma1(mod n)ma\equiv1(mod\ n),则可用dd代替计算:c=md mod bc=md\ mod\ b

前置知识5:拓展欧几里得算法

欧几里得算法是求解a,ba,b的最大公约数(记作gcd(a,b)gcd(a,b))的一种递归算法,也叫辗转相除法gcd(a,b)=gcd(b,a mod b)gcd(a,b)=gcd(b,a\ mod\ b),一直到gcdgcd参数有一个为0。

比如求14和45的最大公约数,即gcd(45,14)=gcd(14,3)=gcd(3,2)=gcd(2,1)=gcd(1,0)=1gcd(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)=7gcd(63,28)=gcd(28,7)=gcd(7,0)=7

我们已知a,ba,b的最大公约数是gcdgcd,那么一定会有x,yx,y满足ax+by=gcd(a,b)ax+by=gcd(a,b),而扩展欧几里得算法就是找到x,yx,y的方法。

  • %表示求余,用//表示整除,假设上一步是gcd(a,b)gcd(a,b),下一步是gcd(b,a%b)gcd(b,a\%b)
  • 已知下一步的x,yx,y满足bx+(a%b)y=gcdbx+(a\%b)y=gcd
  • 代入a%b=a(a//b)×ba\%b=a-(a//b)\times b,得到bx+[a(a//b)b]y=ay+b[x(a//b)y]=gcdbx+[a-(a//b)b]y=ay+b[x-(a//b)y]=gcd
  • 此时可以发现上一步的x1=y,y1=x(a//b)yx_1=y,y_1=x-(a//b)y
  • 也就是说,假设a>ba>b,上一步是gcd(a,b)gcd(a,b)对应ax+by=1ax+by=1,下一步是gcd(b,a%b)gcd(b,a\% b)对应ay+b(xky)=1ay'+b(x'-ky')=1

前置知识6:用拓展欧几里得计算乘法逆元

ab1(mod n)ab\equiv 1(mod\ n)已知a,na,n求b,原式等价于abkn=1, k未知ab-kn=1,\ k未知,而此时把b看作x,-k看作y,那么就是解一个拓展欧几里得的问题了。

RSA密钥生成

  1. 选择两个不相等质数p,qp,q(p=61,q=53)

  2. n=p×qn=p\times qnn的二进制长度就是秘钥长度。n=(3233)

  3. 根据性质,计算ϕ(n)=(p1)(q1)\phi(n)=(p-1)(q-1)φ(n)=(3120)

  4. 选择整数ee,满足1<e<ϕ(n)1<e<\phi(n),且eeϕ(n)\phi(n)互质。假设选了1到3120之间的17

  5. 计算ee对于ϕ(n)\phi(n)的模反元素dd,即满足ed1(mod ϕ(n))ed\equiv 1 (mod\ \phi(n)),也即ed1=kϕ(n)ed-1=k\cdot \phi(n)

    17d+3120k=1,用拓展欧几里得算法得到d=2753,k=-15

  6. 将n和e封装为公钥,n和d封装为私钥

这个算法保证了已知n和e,无法推出d。因为ed1(mod ϕ(n))ed\equiv 1 (mod\ \phi(n))需要知道ϕ(n)\phi(n),而ϕ(n)=(p1)(q1)\phi(n)=(p-1)(q-1)需要知道p,qp,q,而n=pqn=pq,当nn很大的时候,就无法因数分解。

1
2
# 重新整理一下
p,q(不相等大质数) n(无法因数分解的大数) e(和n组成公钥)d(和n组成私钥)φ(n)(算出来的)

RSA加密

设明文为mmmm是一个小于nn的整数。计算cc,使mec(mod n)m^e\equiv c(mod\ n),则cc为密文。

假如要加密m=65,则6517 mod 3233=2790=c\bold{65^{17}\ mod\ 3233=2790=c}

RSA解密

拿到密文cc之后,cd m(mod n)c^d\equiv\ m (mod\ n)

27902753mod 3233=65\bold{2790^{2753}mod\ 3233=65}