前言

本来以前就想学习一下非对称加密算法中,大名鼎鼎的 RSA 算法,但是奈何本人当时不会数论,完全看不懂那些讲解。并且那些讲解往往都没有说清楚每一步在干什么,所以自然也没能理解 RSA 算法。
近日看了一个关于 RSA 算法的讲解视频,茅塞顿开,明白了 RSA 算法的基本原理。在这里就来记录一下自己对 RSA 算法的理解。

注意
这篇文章并不通俗易懂,文章中含有大量数论相关内容。建议在阅读前先了解 同余欧拉定理

公钥和私钥

公钥和私钥都由一对数字组成,这里可以假定公钥为 (N,e)(N,e),私钥为 (N,d)(N,d)。其中两个 NN 是相等的。

使用公钥加密的内容可以用私钥解密,使用私钥加密的内容可以用公钥解密。不过由于公钥是公开的,因此私钥加密一般用于数字签名。公钥和私钥这一对密钥实际上没有什么本质的区别。区别仅在于一个是公开的,一个是不公开的。

加密和解密

加密

假设有明文 xx,使用公钥对数据进行加密的过程,相当于将明文 xx 幂上 ee 并取除以 NN 的余数。这里加密所得的密文 cc 满足: c=xemodN c=x^e \bmod N

解密

解密的过程实际上与加密是一样的,只不过使用的是私钥。使用私钥对数据进行解密的过程,相当于将密文 cc 幂上 dd 并取除以 NN 的余数。这里解密出的明文 xx' 满足: x=cdmodN=xedmodN=x x'=c^d \bmod N=x^{ed} \bmod N=x

这里可以发现密钥对是满足 xedmodN=xx^{ed} \bmod N =x 的,因此重点是需要找到一组数字 N,e,d{N, e, d} 满足上述情况。

样例

例如有这么一对密钥,公钥为 (33,3)(33, 3),私钥为 (33,7)(33, 7)

  1. 加密时,假设有明文 x=25x=25 需要加密,那么就将数据幂上公钥中的 3,得到密文 c=x3mod33=16c=x^3 \bmod 33=16
  2. 解密时,就将密文幂上私钥中的 7,得到明文 x=c7mod33=25x'=c^7 \bmod 33=25

生成密钥对

生成一对密钥首先需要两个质数 p,qp,q,将这两个质数相乘即得到了 NN

这里还需要求出 φ(N)\varphi(N) 的值,这里设为 TT,根据欧拉函数的积性特征可得: T=φ(p)φ(q)=(p1)(q1) T=\varphi(p)\cdot \varphi(q)=(p-1)\cdot(q-1) 而此时就可以开始计算公钥和私钥了,公钥 ee 和私钥 dd 满足: ed1(modT) ed \equiv 1 \pmod T 这里需要先选择出这个密钥对中的其中一个密钥 ee,这里可以随便选,但选择出的密钥需要与 TT 互质,并且 1<e<T1<e<T,这样才能保证能找到另一个密钥 dd。当选出密钥 ee 之后就可以很容易地计算出另一个密钥 dd 了。

最后将 N,eN,e 封装成公钥,N,dN,d 封装成私钥,然后销毁掉 p,q,Tp, q, T 这三个数字。

如果 p,qp,q 取得足够大,那么其乘积 NN 也会变得非常大。想要找到一个大数的两个质因数十分困难,因此保证了 RSA 算法的安全性。

欧拉定理

互质情况

解密时: xed=xkφ(N)+1=x(xφ(N))k x^{ed}=x^{k\varphi(N)+1}=x(x^{\varphi(N)})^k 根据欧拉定理,若 xxNN 互质,则: xφ(N)1(modN) x^{\varphi(N)}\equiv1 \pmod N 可得: xedx(1)kx(modN) x^{ed}\equiv x(1)^k \equiv x \pmod N

不互质情况

xxNN 不互质,不妨设 x=apx=aped1=b(q1)ed-1=b(q-1),则可得: xed=aped0apx(modp) x^{ed}=ap^{ed}\equiv 0\equiv ap\equiv x \pmod p xed=x(xed1)=x(xb(q1))=x(xq1)b=x(xφ(q))bx(1)bx(modq) x^{ed}=x(x^{ed-1})=x(x^{b(q-1)})=x(x^{q-1})^b=x(x^{\varphi(q)})^b\equiv x(1)^b \equiv x \pmod q 整理后即是: xedx(modp) x^{ed}\equiv x \pmod p xedx(modq) x^{ed}\equiv x \pmod q 因此可以证明得到 xedx(modN)x^{ed} \equiv x \pmod N

样例

  1. 先选择两个质数 p=11,q=17p=11,q=17
  2. 可以计算得到 N=pq=187,T=(p1)(q1)=160N=pq=187,T=(p-1)(q-1)=160
  3. 随便选出一个公钥 e=19e=19,计算可得私钥 d=59d=59
  4. 假设有数据 x=114x=114 需要进行加密,那么 c=x19mod187=113c=x^{19} \bmod 187=113
  5. 解密时 x=c59mod187=114x'=c^{59} \bmod 187=114

参考资料