RSA 加密算法是一种非对称加密算法,在公开密钥加密和电子商业中被广泛使用。RSA 是由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在 1977 年一起提出的。当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的。
—— 维基百科
互联网是自由的,我们可以在网上获得几乎任何想得到的信息。1960 年,美国国防部高等研究计划署(DARPA)出于冷战的考虑,建立了网络的老祖宗——ARPANET。网络发展初期,人们并没有考虑太多有关网络安全的事,因为那时网络只有军方还有寥寥几所大学在用,大家在网上分享文献书籍,相互交流,如果还要设置密码只会徒增麻烦。网络给人们带来了极大的便利,其巨大的研究价值和商业价值也被人们发现,随之而来的就是互联网的蓬勃发展及大范围普及。随着用户的增多,信息安全越来越重要,人们需要寻找一种可靠的加密算法,这个时候,RSA 算法开始登上历史舞台。
算法的诞生
RSA 算法诞生的具体细节可以看这篇博客,写的挺好
算法过程
假如 Alice 要通过网络向 Bob 发送一条私人信息,她可以通过如下几步得到一个公钥和密钥:
- 随机选取两个不同的大素数 p 和 q,比如位数超过 100 位。将这两个数乘起来,得到 N=pq
- 根据欧拉函数,求得 r=φ(N)=φ(p)×φ(q)=(p−1)(q−1)
- 选择一个小于 r 且与 r 互质的整数 e。此时必然可以找到一个 d 使得 ed≡1(mod r)
- 销毁 p 和 q。现在 (N,e) 就是的公钥,(N,d) 就是密钥
现在 Alice 把公钥 (N,e) 传给 Bob,私钥 (N,d) 自己藏着。当 Bob 想给 Alice 发送消息 m 时,先约定好信息的处理格式,比如将每一个字转换为这个字的 Unicode 码,然后进行分段加密。将消息 m 的每一段视为数字 n,然后通过:
c≡ne(mod N)
得到加密后的 c。最后将加密后的各段连接起来就可以发给 Alice 了。Alice 收到 Bob 的密文后,先将密文分段,将每一段设为 c,然后就可以通过自己的密钥得到明文:
n≡cd(mod N)
算法原理
前置概念
RSA 加密算法需要一些数论知识,我们首先要知道什么是同余,什么是剩余系,什么是欧拉公式,以及欧拉定理和费马定理的内容1。这里只给出一些必要的知识点,详细证明不做论证,还请看课本1。如果这些内容你都了解,那就可以直接跳到理论推导
同余
对于任意非零整数 a 和 m,一定可以找到一对整数 q 和 r,使得
a=mq+r (0≤r≤m)
这个时候 a 除以 m 会得到余数 r。如果还有一个数 b 同样满足 b=mq′+r,则 a 和 b 除以 m 的余数相同。这个时候我们就说 a 与 b 模 m 同余:
a≡b (mod m)
欧拉公式
欧拉函数 φ(a) 是定义在正整数上的函数,它在正数上的值等于序列 0,1,2,⋯,a−1中与 a 互质的数的个数
简化剩余系
对于非零整数 a 来说,所有的整数除以 a 都只能得到 a 个余数:0,1,⋯,a−1,将余数相同的各自分为一组,可以分为 a 组,我们称这些组为模 a 的剩余类;再从这些剩余类中分别取一个数组成一个集合,这样就得到了 a 的完全剩余系,比如 3 的完全剩余系可以为 1,4,3 或者 0,1,2。
如果一个剩余类中的数模 a 得到的余数和 a 互质,我们就称这是一个与模 a 互质的剩余类。将所有这些剩余类找出来,就得到了 a 的简化剩余类。比如对于 6 来说,它的完全剩余类可以为 0,1,2,3,4,5,简化剩余类 1,5。
定理 X 若 (a,m)=1,在模 m 的所有简化剩余系中各取一个 x,则 ax 也可以构成模 m 的一个简化剩余系
证明:
由于 (a,m)=1,(x,m)=1,则 (ax,m)=1。若在不同的简化剩余系取 x1,x2,则必有
x1≡x2(mod m)
而 ax1≡ax2(mod m),则 a(x1−x2)≡0(mod m),从而 x1≡x2(mod m) 与假设矛盾,所以定理得证
欧拉定理
设 m 是大于 1 的整数,(a,m)=1,则
aφ(m)≡1(mod m)
证明:
我们设 r1,r2,⋯,rφ(m) 是模 m 的简化剩余系,则由定理 X 可以得到 ar1,ar2,⋯,arφ(m) 也是模 m 的简化剩余系,所以
(ar1)⋯(arφ(m))≡r1r2⋯rφ(m)(mod m)
则
aφ(m)(r1r2⋯rφ(m))≡r1r2⋯rφ(m)(mod m)
又因为 (r1r2⋯rφ(m),m)=1,所以可以得到
aφ(m)≡1(mod m)
费马定理
若 p 是素数,则
ap≡a(mod p)
费马定理可以由欧拉定理直接得到:因为 p 是质数,所以 φ(p)=p−1,因此
ap≡a1+φ(p)≡a⋅1≡a(mod p)
理论推导
我们用数学语言再复述一遍算法过程:p 和 q 是两个大质数,N=pq。e 和 d 满足 ed≡1(mod φ(N))。设一个明码为 a(0≤a≤N−1),加密程序将 a 通过 ae≡b(mod N) 转换为 b,并将其发送给接收方。接收方使用密钥通过 bd≡a(mod N) 将 b 还原为明码 a。
在生成密钥时,根据同余的性质,一定可以找到一对 e,d,使得 ed≡1(mod φ(N)),因而加密过程可以正常进行。在解密时,实际上是计算了如下等式:
bd≡aed≡a(mod N)
从而只需要证明 aed≡a(mod N)。因为 ed≡1(mod φ(N)),所以 ed=kφ(N)+1。又由于 N=pq,从而我们只需要证明:
a1+kφ(N)≡a(mod p),a1+kφ(N)≡a(mod q)
因为由欧拉公式可以得到 φ(N)=φ(pq)=(p−1)(q−1)。所以当 p 整除 a(即 a=kp)时,上面第一个式子肯定成立;若 p 不能整除 a 时,由费马定理知 ap−1≡1(mod p),从而
a(p−1)(q−1)≡1q−1≡1(mod p)
从而
a1+kφ(N)≡a⋅ak(p−1)(q−1)≡a⋅1k≡a(mod p)
同理可以得到
a1+kφ(N)≡a(mod q)
综上我们就可以证明通过密钥 d 一定可以将密文还原为明码
实例演示
知道了 RSA 的原理后,我们再看一个例子来加深对整个算法流程的理解。假如 Bob 要向 Alice 发送一个数字 173,那么她需要做如下的操作
首先生成密钥。Alice 选择了两个素数 13 和 19,求得 N 为 247,r 为 216。取 e 为 25,则可以找到 d 为 121,此时正好有 25×121≡1(mod 216)。自此 Alice 得到了私钥 (121,247),并将公钥 (25,247) 交给 Bob。
有了公钥和私钥,Bob 就可以发信息了,17325≡147(mod 247),这样就得到密文 147。Alice 收到密文后,通过 147121≡173(mod 247) 就能够还原出明文 173
算法的安全性
实际上,公钥 e,N 是可以公开的。就是说,如果某人掌握了密钥 d 而不向其他人泄露,就算别人知道他的公钥是 e,N,也几乎不可能将密文解码。因为根据前面的推导可以看到,要想知道密钥 d,就必须知道 φ(N);而要想求出 φ(N),就必须得到 N 的质因数分解。然而令人遗憾的是,迄今为止质因数分解的问题也没有得到解决,只要初始的 p 和 q 设置的足够大,就算量子计算机出马,也够它喝一壶的。
关于 RSA 的保密性能,在历史上有一个有趣的故事。1977 年里维斯、沙米尔和阿德曼用一个 129 位的数 N 和一个 4 位数 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 也要大几百比特,由此导致了该算法的速度非常慢,也不能加密太大的文件,一般是配合对称加密进行使用。
-
《初等数论》闵嗣鹤-高等教育出版社