RSA 加密算法 RSA 加密算法是一种非对称加密算法,在公开密钥加密和电子商业中被广泛使用。RSA 是由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在 1977 年一起提出的。当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的。
—— 维基百科
互联网是自由的,我们可以在网上获得几乎任何想得到的信息。1960 年,美国国防部高等研究计划署(DARPA)出于冷战的考虑,建立了网络的老祖宗——ARPANET。网络发展初期,人们并没有考虑太多有关网络安全的事,因为那时网络只有军方还有寥寥几所大学在用,大家在网上分享文献书籍,相互交流,如果还要设置密码只会徒增麻烦。网络给人们带来了极大的便利,其巨大的研究价值和商业价值也被人们发现,随之而来的就是互联网的蓬勃发展及大范围普及。随着用户的增多,信息安全越来越重要,人们需要寻找一种可靠的加密算法,这个时候,RSA 算法开始登上历史舞台。
算法的诞生 RSA 算法诞生的具体细节可以看这篇博客 ,写的挺好
算法过程 假如 Alice 要通过网络向 Bob 发送一条私人信息,她可以通过如下几步得到一个公钥 和密钥 :
随机选取两个不同的大素数 p p p 和 q q q ,比如位数超过 100 位。将这两个数乘起来,得到 N = p q N=pq N = pq 根据欧拉函数,求得 r = φ ( N ) = φ ( p ) × φ ( q ) = ( p − 1 ) ( q − 1 ) r=\varphi(N)=\varphi(p)\times\varphi(q)=(p-1)(q-1) r = φ ( N ) = φ ( p ) × φ ( q ) = ( p − 1 ) ( q − 1 ) 选择一个小于 r r r 且与 r r r 互质的整数 e e e 。此时必然可以找到一个 d d d 使得 e d ≡ 1 ( m o d r ) ed\equiv 1(mod\ r) e d ≡ 1 ( m o d r ) 销毁 p p p 和 q q q 。现在 ( N , e ) (N,e) ( N , e ) 就是的公钥,( N , d ) (N,d) ( N , d ) 就是密钥 现在 Alice 把公钥 ( N , e ) (N,e) ( N , e ) 传给 Bob,私钥 ( N , d ) (N,d) ( N , d ) 自己藏着。当 Bob 想给 Alice 发送消息 m 时,先约定好信息的处理格式,比如将每一个字转换为这个字的 Unicode 码,然后进行分段加密。将消息 m 的每一段视为数字 n,然后通过:
c ≡ n e ( m o d N ) c\equiv n^e(mod\ N) c ≡ n e ( m o d N )
得到加密后的 c。最后将加密后的各段连接起来就可以发给 Alice 了。Alice 收到 Bob 的密文后,先将密文分段,将每一段设为 c,然后就可以通过自己的密钥得到明文:
n ≡ c d ( m o d N ) n\equiv c^d(mod\ N) n ≡ c d ( m o d N )
算法原理 前置概念 RSA 加密算法需要一些数论知识,我们首先要知道什么是同余,什么是剩余系,什么是欧拉公式,以及欧拉定理和费马定理的内容。这里只给出一些必要的知识点,详细证明不做论证,还请看课本。如果这些内容你都了解,那就可以直接跳到理论推导
同余 对于任意非零整数 a a a 和 m m m ,一定可以找到一对整数 q q q 和 r r r ,使得
a = m q + r ( 0 ≤ r ≤ m ) a=mq+r\ (0\leq r\le m) a = m q + r ( 0 ≤ r ≤ m )
这个时候 a a a 除以 m m m 会得到余数 r r r 。如果还有一个数 b b b 同样满足 b = m q ’ + r b=mq’+r b = m q ’ + r ,则 a a a 和 b b b 除以 m m m 的余数相同。这个时候我们就说 a a a 与 b b b 模 m m m 同余:
a ≡ b ( m o d m ) a\equiv b\ (mod\ m) a ≡ b ( m o d m )
欧拉公式 欧拉函数 φ ( a ) \varphi(a) φ ( a ) 是定义在正整数上的函数,它在正数上的值等于序列 0 , 1 , 2 , ⋯ , a − 1 0,1,2,\cdots,a-1 0 , 1 , 2 , ⋯ , a − 1 中与 a a a 互质的数的个数
简化剩余系 对于非零整数 a a a 来说,所有的整数除以 a a a 都只能得到 a a a 个余数:0 , 1 , ⋯ , a − 1 0,1,\cdots,a-1 0 , 1 , ⋯ , a − 1 ,将余数相同的各自分为一组,可以分为 a a a 组,我们称这些组为模 a a a 的剩余类 ;再从这些剩余类中分别取一个数组成一个集合,这样就得到了 a a a 的完全剩余系 ,比如 3 的完全剩余系可以为 1,4,3 或者 0,1,2。
如果一个剩余类中的数模 a a a 得到的余数和 a a a 互质,我们就称这是一个与模 a a a 互质的剩余类。将所有这些剩余类找出来,就得到了 a a a 的简化剩余类 。比如对于 6 来说,它的完全剩余类可以为 0,1,2,3,4,5,简化剩余类 1,5。
定理 X 若 ( a , m ) = 1 (a,m)=1 ( a , m ) = 1 ,在模 m m m 的所有简化剩余系中各取一个 x x x ,则 a x ax a x 也可以构成模 m m m 的一个简化剩余系
证明 :
由于 ( a , m ) = 1 , ( x , m ) = 1 (a,m)=1,(x,m)=1 ( a , m ) = 1 , ( x , m ) = 1 ,则 ( a x , m ) = 1 (ax,m)=1 ( a x , m ) = 1 。若在不同的简化剩余系取 x 1 x_1 x 1 ,x 2 x_2 x 2 ,则必有
x 1 ≢ x 2 ( m o d m ) x_1\not\equiv x_2(mod\ m) x 1 ≡ x 2 ( m o d m )
而 a x 1 ≡ a x 2 ( m o d m ) ax_1\equiv ax_2(mod\ m) a x 1 ≡ a x 2 ( m o d m ) ,则 a ( x 1 − x 2 ) ≡ 0 ( m o d m ) a(x_1-x_2)\equiv 0(mod\ m) a ( x 1 − x 2 ) ≡ 0 ( m o d m ) ,从而 x 1 ≡ x 2 ( m o d m ) x_1\equiv x_2(mod\ m) x 1 ≡ x 2 ( m o d m ) 与假设矛盾,所以定理得证
欧拉定理 设 m m m 是大于 1 的整数,( a , m ) = 1 (a,m)=1 ( a , m ) = 1 ,则
a φ ( m ) ≡ 1 ( m o d m ) a^{\varphi(m)}\equiv 1(mod\ m) a φ ( m ) ≡ 1 ( m o d m )
证明 :
我们设 r 1 , r 2 , ⋯ , r φ ( m ) r_1,r_2,\cdots,r_{\varphi(m)} r 1 , r 2 , ⋯ , r φ ( m ) 是模 m m m 的简化剩余系,则由定理 X 可以得到 a r 1 , a r 2 , ⋯ , a r φ ( m ) ar_1,ar_2,\cdots,ar_{\varphi(m)} a r 1 , a r 2 , ⋯ , a r φ ( m ) 也是模 m m m 的简化剩余系,所以
( a r 1 ) ⋯ ( a r φ ( m ) ) ≡ r 1 r 2 ⋯ r φ ( m ) ( m o d m ) (ar_1)\cdots(ar_{\varphi(m)})\equiv r_1r_2\cdots r_{\varphi(m)}(mod\ m) ( a r 1 ) ⋯ ( a r φ ( m ) ) ≡ r 1 r 2 ⋯ r φ ( m ) ( m o d m )
则
a φ ( m ) ( r 1 r 2 ⋯ r φ ( m ) ) ≡ r 1 r 2 ⋯ r φ ( m ) ( m o d m ) a^{\varphi(m)}(r_1r_2\cdots r_{\varphi(m)})\equiv r_1r_2\cdots r_{\varphi(m)}(mod\ m) a φ ( m ) ( r 1 r 2 ⋯ r φ ( m ) ) ≡ r 1 r 2 ⋯ r φ ( m ) ( m o d m )
又因为 ( r 1 r 2 ⋯ r φ ( m ) , m ) = 1 (r_1r_2\cdots r_{\varphi(m)},m)=1 ( r 1 r 2 ⋯ r φ ( m ) , m ) = 1 ,所以可以得到
a φ ( m ) ≡ 1 ( m o d m ) a^{\varphi(m)}\equiv 1(mod\ m) a φ ( m ) ≡ 1 ( m o d m )
费马定理 若 p p p 是素数,则
a p ≡ a ( m o d p ) a^{p}\equiv a(mod\ p) a p ≡ a ( m o d p )
费马定理可以由欧拉定理直接得到:因为 p p p 是质数,所以 φ ( p ) = p − 1 \varphi(p)=p-1 φ ( p ) = p − 1 ,因此
a p ≡ a 1 + φ ( p ) ≡ a ⋅ 1 ≡ a ( m o d p ) a^{p}\equiv a^{1+\varphi(p)}\equiv a\cdot 1\equiv a(mod\ p) a p ≡ a 1 + φ ( p ) ≡ a ⋅ 1 ≡ a ( m o d p )
理论推导 我们用数学语言再复述一遍算法过程:p p p 和 q q q 是两个大质数,N = p q N=pq N = pq 。e e e 和 d d d 满足 e d ≡ 1 ( m o d φ ( N ) ) ed\equiv1(mod\ \varphi(N)) e d ≡ 1 ( m o d φ ( N )) 。设一个明码为 a ( 0 ≤ a ≤ N − 1 ) a(0\leq a\leq N-1) a ( 0 ≤ a ≤ N − 1 ) ,加密程序将 a a a 通过 a e ≡ b ( m o d N ) a^e\equiv b(mod\ N) a e ≡ b ( m o d N ) 转换为 b b b ,并将其发送给接收方。接收方使用密钥通过 b d ≡ a ( m o d N ) b^d\equiv a(mod\ N) b d ≡ a ( m o d N ) 将 b b b 还原为明码 a a a 。
在生成密钥时,根据同余的性质,一定可以找到一对 e e e ,d d d ,使得 e d ≡ 1 ( m o d φ ( N ) ) ed\equiv1(mod\ \varphi(N)) e d ≡ 1 ( m o d φ ( N )) ,因而加密过程可以正常进行。在解密时,实际上是计算了如下等式:
b d ≡ a e d ≡ a ( m o d N ) b^d\equiv a^{ed}\equiv a(mod\ N) b d ≡ a e d ≡ a ( m o d N )
从而只需要证明 a e d ≡ a ( m o d N ) a^{ed}\equiv a(mod\ N) a e d ≡ a ( m o d N ) 。因为 e d ≡ 1 ( m o d φ ( N ) ) ed\equiv1(mod\ \varphi(N)) e d ≡ 1 ( m o d φ ( N )) ,所以 e d = k φ ( N ) + 1 ed=k\varphi(N) + 1 e d = k φ ( N ) + 1 。又由于 N = p q N=pq N = pq ,从而我们只需要证明:
a 1 + k φ ( N ) ≡ a ( m o d p ) , a 1 + k φ ( N ) ≡ a ( m o d q ) a^{1+k\varphi(N)}\equiv a(mod\ p),a^{1+k\varphi(N)}\equiv a(mod\ q) a 1 + k φ ( N ) ≡ a ( m o d p ) , a 1 + k φ ( N ) ≡ a ( m o d q )
因为由欧拉公式可以得到 φ ( N ) = φ ( p q ) = ( p − 1 ) ( q − 1 ) \varphi(N)=\varphi(pq)=(p-1)(q-1) φ ( N ) = φ ( pq ) = ( p − 1 ) ( q − 1 ) 。所以当 p p p 整除 a a a (即 a = k p a=kp a = k p )时,上面第一个式子肯定成立;若 p p p 不能整除 a a a 时,由费马定理知 a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv1(mod\ p) a p − 1 ≡ 1 ( m o d p ) ,从而
a ( p − 1 ) ( q − 1 ) ≡ 1 q − 1 ≡ 1 ( m o d p ) a^{(p-1)(q-1)}\equiv1^{q-1}\equiv1(mod\ p) a ( p − 1 ) ( q − 1 ) ≡ 1 q − 1 ≡ 1 ( m o d p )
从而
a 1 + k φ ( N ) ≡ a ⋅ a k ( p − 1 ) ( q − 1 ) ≡ a ⋅ 1 k ≡ a ( m o d p ) a^{1+k\varphi(N)}\equiv a\cdot a^{k(p-1)(q-1)}\equiv a\cdot1^{k}\equiv a(mod\ p) a 1 + k φ ( N ) ≡ a ⋅ a k ( p − 1 ) ( q − 1 ) ≡ a ⋅ 1 k ≡ a ( m o d p )
同理可以得到
a 1 + k φ ( N ) ≡ a ( m o d q ) a^{1+k\varphi(N)}\equiv a(mod\ q) a 1 + k φ ( N ) ≡ a ( m o d q )
综上我们就可以证明通过密钥 d d d 一定可以将密文还原为明码
实例演示 知道了 RSA 的原理后,我们再看一个例子来加深对整个算法流程的理解。假如 Bob 要向 Alice 发送一个数字 173,那么她需要做如下的操作
首先生成密钥。Alice 选择了两个素数 13 和 19,求得 N N N 为 247,r r r 为 216。取 e e e 为 25,则可以找到 d d d 为 121,此时正好有 25 × 121 ≡ 1 ( m o d 216 ) 25\times121\equiv 1(mod\ 216) 25 × 121 ≡ 1 ( m o d 216 ) 。自此 Alice 得到了私钥 ( 121 , 247 ) (121,247) ( 121 , 247 ) ,并将公钥 ( 25 , 247 ) (25,247) ( 25 , 247 ) 交给 Bob。
有了公钥和私钥,Bob 就可以发信息了,17 3 25 ≡ 147 ( m o d 247 ) 173^{25}\equiv 147(mod\ 247) 17 3 25 ≡ 147 ( m o d 247 ) ,这样就得到密文 147。Alice 收到密文后,通过 14 7 121 ≡ 173 ( m o d 247 ) 147^{121}\equiv173(mod\ 247) 14 7 121 ≡ 173 ( m o d 247 ) 就能够还原出明文 173
算法的安全性 实际上,公钥 e , N e,N e , N 是可以公开的。就是说,如果某人掌握了密钥 d d d 而不向其他人泄露,就算别人知道他的公钥是 e , N e,N e , N ,也几乎不可能将密文解码。因为根据前面的推导可以看到,要想知道密钥 d d d ,就必须知道 φ ( N ) \varphi(N) φ ( N ) ;而要想求出 φ ( N ) \varphi(N) φ ( N ) ,就必须得到 N N N 的质因数分解。然而令人遗憾的是,迄今为止质因数分解的问题也没有得到解决,只要初始的 p p p 和 q q q 设置的足够大,就算量子计算机出马,也够它喝一壶的。
关于 RSA 的保密性能,在历史上有一个有趣的故事。1977 年里维斯、沙米尔和阿德曼用一个 129 位的数 N N N 和一个 4 位数 e e e 对一个关于秃鹰的消息在 RSA 中加密,即所谓的 RSA-129,还悬赏 100 美元,奖给第一个破译该密码的人。他们认为按照当时计算机的速度,估计分解一个 129 位的数大约要花 23000 年,计算速度提高可能会降低一两个数量级,但是安全性似乎仍然相当有保证。然而出乎他们的预料,仅仅在 17 年之后 RSA-129 就败下阵来。分解成功的核心在于发明了一种新的筛法——二次筛法,这方法有一个优点是能将工作分散到不同的计算机上去做。人们组织了大约有六百多人的因子分解迷,经过八个月的努力找到了 RSA-129 的分别为 64 位和 65 位的两个质因数。但是,RSA-129 分解的成功,甚至包括数学家们近年来不断创造的许多新算法,例如二次筛法、数域筛法、椭圆曲线算法,目前还不足以威胁 RSA 体制的安全性。因为用以分解数字所需要的计算机的能力,随着数字的位数的增加而飞快地增加。例如,使用 RSA-200 至 RSA-300,那么除非计算数论有惊人的突破,否则因子分解在一个长时期内仍然是个难题
算法的优缺点 优点:RSA 算法是一种非对称加密算法,同时其安全性与质因数分解的难度相关,所以安全性较好。而且 RSA 算法自 1977 年提出一直用到现在,经历了无数次考验,足以见其安全稳定。
缺点:为了确保安全性,需要使用很长的质数生成 N N N ,找到超长素数的难度不说,为了存储 N N N 也要大几百比特,由此导致了该算法的速度非常慢,也不能加密太大的文件,一般是配合对称加密进行使用。