RSA加密算法解析
摘要
我们知道,常见的加密算法可以分为对称加密和非对称加密,对于对称加密,很好理解,就是使用同一个密钥把一段内容通过一段算法加密or解密,这很好理解,我可以使用最简单的字符偏移实现一个简单的对称加密。
但是非对称加密,使用公钥对一段内容加密之后只有私钥才能解密,就类似你用一把锁把房间锁住了,只有拿到钥匙才能打开;所以,我一直很好奇,这啥原理?锁和钥匙是怎么样生成的呢,锁定和解锁的过程是怎样的呢。
今天我将通过一个例子,彻底解开非对称加密的奥秘:
1.使用11和13得到一对密钥:公钥(143,7),私钥(143,103)
2.使用公钥加密数字5,得到加密内容是47
3.使用私钥解密47最终得到5
过程中会涉及到一些基础的数学知识,不是很难,有数学基础的可以略过,直接看 让我们来实践检验真理
什么是RSA加密算法?
RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的 。非对称加密RSA就是基于RSA算法实现的。所谓非对称加密,是指用于加密和解密的密钥是不相同的。而对称加密则是加密和解密的密钥是相同的,这就导致了密钥传递过程中会存在安全问题;而在非对称加密中用来解密的密钥称为私钥,它是不对外公布的,而用于加密的公钥是对外公布的。

看到这里你肯定很好奇它到底是怎么样做到加密和解密的呢,它又是怎样保证安全性的呢?
接下来将一步步揭开RSA加密算法的神秘面纱。
一点数学知识
质数:也称素数,除了1和本身,不能被其他数整除的数。如,2,3,5,7,11等等
互质关系:如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系,如3和5,5和7等等。
- 任意两个质数构成互质关系,比如3和5。
- 一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系,比如3和7。
- 如果两个数之中,较大的那个数是质数,则两者构成互质关系,比如10和37。
- p是大于1的整数,则p和p-1构成互质关系,比如10和9。
- p是大于1的奇数,则p和p-2构成互质关系,比如33和31。
- 1和任意一个自然数是都是互质关系,比如1和10。
欧拉函数:描述任意给定正整数n,在小于等于n的正整数之中,有多少个与n构成互质关系,用 ϕ(n)表示。
- n=1时,ϕ(n) = 1
- n是质数,ϕ(n) = n-1
- n = pk (p为质数,k为大于等于1的整数),ϕ(n) = pk−pk−1
- n = p1×p2 (p1,p2 是质数),ϕ(n)=ϕ(p1p2)=ϕ(p1)ϕ(p2)=(p1−1)×(p2−1)
- n=p1k1p2k2p3k3...pxkx(p是质数,k是整数),ϕ(n)=n(1−p11)(1−p21)(1−p31)...(1−px1)
欧拉定理:如果两个正整数a和n互质,则n的欧拉函数 ϕ(n) 可以让下面的等式成立:
αϕ(n)≡1(modn)
- 特例:如果n是质数,则 αn−1≡1(modn);这也称为费马定理。
- (αϕ(n))h≡1(modn) ,h是正整数。
- αϕ(n)×x≡x(modn)x是整数 。
模反元素:如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1
ab=1(modn)
这时,b就叫做a的模反元素。
让我们来实践检验真理
1.密钥生成
-
随机取两个质数p,q,这里假如取11和13,真实情况下取得数会比较大,这里方便为了方便计算取得较小。实际应用中这两个数越大越难破解
n=pq=143,ϕ(n)=10×12=120
-
取一个整数e,e满足1<e<ϕ(n),e和ϕ(n)互质。求e对ϕ(n)的模反元素d
ed = 1 (mod ϕ(n)) => ed = hϕ(n)+1 => ed + ϕ(n)y=1
取e=7带入数据:7d + 120 y = 1
解的一组解:d = 103,y=-6
-
于是得到了公钥(n,e),私钥(n,d),实际应用中采用的是ASN.1格式。
-
下面带入一组数据验证一下(数字较大可使用大数计算器):
假设要加密的数据m=5;
用公钥加密:me=c(modn) 带入数据:57=cmod(143) => c = 47
用私钥解密:cd=m(modn) 带入数据 47103=m(mod143) => m = 5
数学证明
证明 cd=m(modn),通俗的说就是证明左边除以n的余数是m:
根据加密公式 me=c(modn)
c=me−kn,k为系数;带入原式:
(me−kn)d=m(modn)
对左边展开:Cd0(me)d(kn)0+Cd1(me)d−1(kn)1+Cd2(me)d−2(kn)2...Cdd(me)d−d(kn)d=m(modn)
左边除了第一项都带n,所以左边除n的余数必然等于左边第一项除n的余数所以上式子等价于求证:med=m(modn)
∵ed=hϕ(n)+1
∴上式子又等价于求证mϕ(n)+1=m(modn)
-
如果m、n互质。
mϕ(n)=1(modn)
两边同乘m,得 mϕ(n)+1=m(modn),证毕。
-
如果m、n不互质。
∵n=pq,pq互质,n、m不互质
∴m=kp∣∣kq,k为整数
假设m=kp,此时m和q必然互质
∴mq−1=1(modq)=>根据欧拉定理第2点特性可得:(mq−1)h(p−1)=1(modq)=>(mq−1)h(p−1)×m=m(modq)
∵ed=hϕ(n)+1,ϕ(n)=(p−1)(q−1)
∴med=m(modq)
∵m=kp
∴kped=kp(modq)=>kped=zq+kp
两边同除p:
pkped=pzq+k
∴pkped
是整数,k是整数,所以pzq也必定是整数,而pq互质,所以z必定是p的整数倍
∴z=z′p带入上面式子得:kped=z′pq+kp
∵kp=m,pq=n
∴med=z′n+m=>med=m(modn),证毕。
安全性分析
由上面密钥生成的例子可知,密钥破解的关键就是d,因为n,e都是公开的,∵ed=hϕ(n)+1,要求d就必须知道ϕ(n),而ϕ(n)=(p−1)(p−1),所以必须对n进行因式分解,n比较小还好,但是实际应用中n的长度一般都是1024二进制位或者2048二进制位,目前人类公布的能破解的最大位数是768二进制位,每增加一位对破解难度都是指数级增加。更何况就算知道了pq,d也只是ed + ϕ(n) y = 1 无数组整数解中的一组。所以可知破解难度有多大。就目前人类的科技水平而言,实际应用中1024位是非常安全,2048位是绝对安全。