一、数学知识
1. 质数
质数,又称素数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。
2. 互质数
百度百科上的解释是:公因数只有1的两个数,叫做互质数。
维基百科上的解释是:互质,又称互素。若N个整数的最大公因子是1,则称这N个整数互质。
常见的互质数判断方法主要有以下几种:
两个不同的质数一定是互质数。例如,2与7、13与19。
一个质数,另一个不为它的倍数,这两个数为互质数。例如,3与10、5与 26。
相邻的两个自然数是互质数。如 15与 16。
相邻的两个奇数是互质数。如 49与 51。
较大数是质数的两个数是互质数。如97与88。
小数是质数,大数不是小数的倍数的两个数是互质数。例如 7和 16。
2和任何奇数是互质数。例如2和87。
1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。
辗转相除法。
3. 模运算
模运算:即求余运算,“模”是“mod”的音译。和模运算紧密相关的一个概念是“同余”,当两个整数除以同一个正整数,若得相同余数,则称这两个整数同余。
如:两个整数a、b,若它们除以正整数m所得的余数相同,则称a、b对于模m同余,记为a=b(mod m),读为a与b关于模m同余。例如26=14(mod 12)
二、RSA加密算法原理
1. RSA加密
通式:
即RSA加密就是对明文进行E次方后除以N后求余数的过程。其中,E是加密(Encryption)的首字母,N是数字(Number)的首字母。
由此可知,只要知道E、N就可以进行RSA加密,所以说E、N就是RSA加密的密钥,E和N的组合就是公钥,记为
公钥=(E,N)
2. RSA解密
通式:
即RSA解密就是对密文进行D次方除以N后求余数的过程。其中,D是解密(Decryption)的首字母。
由此可知,只要知道D、N就可以进行RSA解密,所以说D、N就是RSA解密的密钥,D和N的组合就是私钥,记为
3. 生成密钥对
密钥对=(E,D,N)
(1)求N
准备两个质数p、q(注意不能太小,否则容易破解),求
N=p*q
(2)求E
建立一个中间数L,使得L是p-1和q-1的最小公倍数,即
L=(p-1)*(q-1)
满足以下两个条件的数即为E:
gcd(E,L)=1
其中,需要满足E和L的最大公约数为1是为了保证一定存在D。
(3)求D
满足以下两个条件的数即为D:
E *D mod L = 1或E*D=1 (mod L)
E*D mod L=1D等价于E*D-1=kL,k为常数,由此可解出D。
密钥对的求法 | |
求N | N=p*q;p,q为质数,且p不等于q |
求L | L=(p-1)(q-1) |
求E | 1 < E < L,gcd(E,L)=1;E,L最大公约数为1(E和L互质) |
求D | 1 < D < L,E*D mod L = 1 |
假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息。她以以上的方式来产生一个公钥和一个私钥:
(1)随意选择两个大的质数p和q,p不等于q,计算N=p*q。比如选取61和53,则N=61*53=3233,化为二进制则是110010100001,一共12位,所以这个密钥就是12位,实际应用中,RSA密钥一般是1024位,重要场合则是2048位。
(2)求得L =lcm(p-1,q-1)
(3)求E:1 < E < L,gcd(E,L)=1(即L和E互质)
(4)求D:1 < D < L,E*D mod L = 1
(5)将 p 和 q 的记录销毁,得到公钥=(E,N),私钥=(D,N),Alice将她的公钥传给Bob,而将她的私钥藏起来。
假设Bob想给Alice送一个消息m,他知道Alice产生的N和E,就以下加密通式对明文进行加密,得到密文后就传递给Alice:
Alice得到Bob发送过来的密文后就可以利用以下解密通式,结合自己保存的密钥来进行解密:
RSA也可以用来为一个消息署名。假如甲想给乙传递一个署名的消息的话,那么她可以为她的消息计算一个散列值(Message digest),然后用她的密钥(private key)加密这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。乙获得这个消息后可以用甲的公钥解密这个散列值,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那么他就可以知道发信人持有甲的密钥,以及这个消息在传播路径上没有被篡改过。
三、RSA加密算法的特点
1. RSA算法的特点
这种算法非常可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是768个二进制位。也就是说,长度超过768位的密钥,还无法破解(至少没人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全。
2. RSA加密算法的安全性
已知公钥=(E,N)公开,私钥=(D,N)保密,假设在已知E,N的情况下,能否推出D?
分析:
(1)由E*D mod L=1可知,只有知道E和L,才能算出D。
(2)由L=lcm(p-1,q-1)可知,只有知道p和q,才能算出L。
(3)由N=p*q可知,在知道N的情况下,只有将N因数分解,才能算出p和q。
结论:若N可以被因数分解,D就可以被算出,即私钥被破解。由于对极大整数进行因数分解的难度很大,这就决定了RSA算法的安全性。
当p和q是一个大素数的时候,从它们的积pq去分解因子p和q,这是一个公认的数学难题。然而,虽然RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。
1994年彼得·秀尔(Peter Shor)证明一台量子计算机可以在多项式时间内进行因数分解。假如量子计算机有朝一日可以成为一种可行的技术的话,那么秀尔的算法可以淘汰RSA和相关的衍生算法。(即依赖于分解大整数困难性的加密算法)
另外,假如N的长度小于或等于256位,那么用一台个人电脑在几个小时内就可以分解它的因子了。1999年,数百台电脑合作分解了一个512位长的N。1997年后开发的系统,用户应使用1024位密钥,证书认证机构应用2048位或以上。
3. RSA加密算法的缺点
虽然RSA加密算法作为目前最优秀的公钥方案之一,在发表三十多年的时间里,经历了各种攻击的考验,逐渐为人们接受。但是,也不是说RSA没有任何缺点。由于没有从理论上证明破译RSA的难度与大数分解难度的等价性。所以,RSA的重大缺陷是无法从理论上把握它的保密性能如何。在实践上,RSA也有一些缺点:
(1)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密;
(2)分组长度太大,为保证安全性,n 至少也要 600 bits 以上,使运算代价很高,尤其是速度较慢。