概述

RSA加密算法是一种非对称加密算法,在公开密钥加密和电子商业中被广泛使用。RSA是由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

前置知识

欧拉函数

在数论中,对正整数n,欧拉函数φ(n)\displaystyle \varphi (n)是小于等于n\displaystyle n的正整数中与n\displaystyle n互质的数的数目。例如φ(8)=4\displaystyle \varphi \left(8\right)=4,因为1、3、5和7均与8互质。

欧拉函数是积性函数,即是说若m,n\displaystyle m,n互质,则:

φ(mn)=φ(m)φ(n)\displaystyle \varphi (mn)=\varphi (m)\varphi (n)

使用中国剩余定理有较简略的证明:设A,B,C\displaystyle A,B,C是跟m,n,mn\displaystyle m,n ,mn互质的数的集,据中国剩余定理,A×B\displaystyle A\times BC\displaystyle C可建立双射(一一对应)关系,因此两者元素个数相等。

欧拉定理

在数论中,欧拉定理(也称费马-欧拉定理)是一个关于同余的性质。欧拉定理表明,若n,a\displaystyle n,a为正整数,且n,a\displaystyle n,a互素(即gcd(a,n)=1\displaystyle \gcd(a,n)=1),则:

aφ(n)1(modn)\displaystyle a^{\varphi (n)}\equiv 1{\pmod {n}}

aφ(n)\displaystyle a^{\varphi (n)}1\displaystyle 1在模n\displaystyle n下同余。欧拉定理实际上是费马小定理的推广。

模逆元

模逆元(Modular multiplicative inverse)也称为模倒数、数论倒数。

一整数a\displaystyle a对同余n\displaystyle n之模逆元是指满足以下公式的整数b\displaystyle b

a1b(modn).\displaystyle a^{-1}\equiv b{\pmod {n}}.

也可以写成ab1(modn)\displaystyle ab\equiv 1{\pmod {n}}或者abmodn=1\displaystyle ab\mod {n}=1

整数a\displaystyle a对模数n\displaystyle n之模逆元存在的充分必要条件是a\displaystyle an\displaystyle n互素,若此模逆元存在,在模数n\displaystyle n下的除法可以用和对应模逆元的乘法来达成,此概念和实数除法的概念相同。

RSA算法

公钥与私钥的产生

假设Alice想要通过不可靠的媒体接收Bob的私人消息。她可以用以下的方式来产生一个公钥和一个私钥:

  1. 随意选择两个大的素数p\displaystyle pq\displaystyle qp\displaystyle p不等于q\displaystyle q,计算N=pq\displaystyle N=pq
  2. 根据欧拉函数,求得r=φ(N)=φ(p)×φ(q)=(p1)(q1)\displaystyle r=\varphi (N)=\varphi (p)\times \varphi (q)=(p-1)(q-1)
  3. 选择一个小于r\displaystyle r的整数e\displaystyle e,使e\displaystyle er\displaystyle r互质。并求得e\displaystyle e关于r\displaystyle r的模逆元,命名为d\displaystyle d(求d\displaystyle ded1(modr)\displaystyle ed\equiv 1{\pmod {r}})。(模逆元存在,当且仅当e\displaystyle er\displaystyle r互质。)
  4. p\displaystyle pq\displaystyle q的记录销毁。

其中,(N,e)\displaystyle (N,e)是公钥,(N,d)\displaystyle (N,d)是私钥。Alice将她的公钥(N,e)\displaystyle (N,e)传给Bob,而将她的私钥(N,d)\displaystyle (N,d)藏起来。

加密消息

假设Bob想给Alice送消息m\displaystyle m,他知道Alice产生的N\displaystyle Ne\displaystyle e。他使用起先与Alice约好的格式将m\displaystyle m转换为一个小于N\displaystyle N的非负整数n\displaystyle n,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为n\displaystyle n。用下面这个公式他可以将n\displaystyle n加密为c\displaystyle c

c=nemodN\displaystyle c=n^{e}{\bmod {N}}

这里的c\displaystyle c可以用模幂算法快速求出来。Bob算出c\displaystyle c后就可以将它传递给Alice。

解密消息

Alice得到Bob的消息c\displaystyle c后就可以利用她的密钥d\displaystyle d来解码。她可以用以下这个公式来将c\displaystyle c转换为n\displaystyle n

c=nemodN\displaystyle c=n^{e}{\bmod {N}}

与Bob计算c\displaystyle c类似,这里的n\displaystyle n也可以用模幂算法快速求出。得到n\displaystyle n后,她可以将原来的信息m\displaystyle m重新复原。

解码的原理是

cdned (mod N)\displaystyle c^{d}\equiv n^{e\cdot d}\ (\mathrm {mod} \ N)

已知ed1(modr)\displaystyle ed\equiv 1{\pmod {r}},即 ed=1+hφ(N)\displaystyle ed=1+h\varphi (N)。那么有

ned=n1+hφ(N)=nnhφ(N)=n(nφ(N))h\displaystyle n^{ed}=n^{1+h\varphi (N)}=n\cdot n^{h\varphi (N)}=n\left(n^{\varphi (N)}\right)^{h}

  • n\displaystyle nN\displaystyle N互素,则由欧拉定理得:

nedn(nφ(N))hn(1)hn(modN)\displaystyle n^{ed}\equiv n\left(n^{\varphi (N)}\right)^{h}\equiv n(1)^{h}\equiv n{\pmod {N}}

  • n\displaystyle nN\displaystyle N不互素,则不失一般性考虑n=ph\displaystyle n=ph,以及ed1=k(q1)\displaystyle ed-1=k(q-1),得:

ned=(ph)ed0phn(modp)\displaystyle n^{ed}=(ph)^{ed}\equiv 0\equiv ph\equiv n{\pmod {p}}

ned=ned1n=nk(q1)n=(nq1)kn1knn(modq)\displaystyle n^{ed}=n^{ed-1}n=n^{k(q-1)}n=(n^{q-1})^{k}n\equiv 1^{k}n\equiv n{\pmod {q}}

nedn(modN)\displaystyle n^{ed}\equiv n{\pmod {N}}得证。

签名消息

RSA也可以用来为一个消息署名。假如Alice想给Bob传递一个署名的消息的话,那么她可以为她的消息计算一个散列值(Message digest),然后用她的私钥“加密”(如同前面“加密消息”的步骤)这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。Bob获得这个消息后可以用Alice的公钥“解密”(如同前面“解密消息”的步骤)这个散列值,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那么Bob就可以知道发信人持有Alice的私钥,以及这个消息在传播路径上没有被篡改过。

RSA安全性

假设偷听者Eve获得了Alice的公钥N\displaystyle Ne\displaystyle e以及Bob的加密消息c\displaystyle c,但她无法直接获得Alice的密钥d\displaystyle d。要获得d\displaystyle d,最简单的方法是将N\displaystyle N分解为p\displaystyle pq\displaystyle q,这样她可以得到同余方程

de1(mod(p1)(q1))\displaystyle de\equiv 1(\mathrm {mod} (p-1)(q-1))

并解出d\displaystyle d,然后代入解密公式

cdn (mod N)\displaystyle c^{d}\equiv n\ (\mathrm {mod} \ N)

导出n\displaystyle n(破密)。

至今为止还没有人找到一个多项式时间的算法来分解一个大的整数的因子,也没有找到比因数分解更简单的破密方法。因此今天一般认为只要N\displaystyle N足够大,黑客就没有办法破解。

NIST建议的RSA密钥长度为至少2048位。实现上,强制设置密钥长度为2048位的称RSA或RSA2(意即RSA version 2),而未强制设置的称RSA1以资区别,两者差异主要在密钥长度。

参考资料

维基百科:欧拉函数

维基百科:欧拉定理(数论)

维基百科:模逆元

维基百科:模幂

维基百科:RSA加密算法