RSA算法过程及安全性

简介:

     RSA算法是著名和可靠的非对称密钥和加密算法。介绍RSA算法之前,先要知道素数的概念,因为这是RSA算法的基础。

素数就是只能被1和本身整除的数,1和2是素数,2以上的素数只能是奇数。

RSA算法就是基于这样的数学事实:两个大素数相乘很容易,而对得到的积求因子则很难。RSA中的私钥和公钥基于大素数(100位以上),算法本身很简单,但实际难度在于RSA选择和生成的私钥和公钥。

RSA运算结构:

如何生成私钥和公钥,如何用其进行加密和解密。

(1)选择两个大素数 P、Q

(2)计算 N = P * Q

(3)选择一个公钥(即加密密钥)E,使其不是(P-1)(Q-1)的因子

(4)选择私钥(即解密密钥)D,满足下列条件:
		(D * E)  mod (P-1) * (Q-1) = 1
		
(5)加密时,从明文PT计算密文CT如下:
		CT = PT^E mod N
		
(6)将密文CT发送给接收方

(7)解密时,从密文CT计算明文PT如下:
		PT = CT^D mod N

RSA示例:

(1)选择两个大素数 P、Q。
	设计P = 7,Q = 17
	
(2)计算N = P * Q
	得 N = 7 * 17 = 119
	
(3)选择一个公钥(即加密密钥)E,使其不是(P-1)(Q-1)的因子
	·求出(7-1)(17-1)=6*16=96
	·96的因子为2,2,2,2,2,3(因为96=2*2*2*2*2*3)
	·因此,E不能有因子2和3。例如,不能选择4(因为2是它的因子),15(因为3是它的因子)或6(2,2都是它的因子)
	·假设选择E为5.
	
(4)选择私钥(即解密密钥)D,满足下列条件:
	(D*E) mod (P-1)*(Q-1) = 1
	·将E、P、Q的值带入公式。
	·得到:(D*5) mod (7-1)(17-1) = 1
	·经过计算,取D=77。
	
(5)加密时,从明文PT计算密文CT如下:
	CT = PT^E mod N
	·假设要加密的明文10。则
	·CT = 10^5 mod 119 = 100000 mod 119 = 40
	
(6)将密文CT发送给接收方。
	将密文40发送给接收方
	
(7)解密时,从密文CT计算明文PT如下:
	PT = CT^D mod N
	计算如下:
	·PT = CT^D mod N
	·即PT = 40^77 mod 119 =10
	·解出明文

下面来看上面相同的示例,但稍有不同。

(1)取P=7,Q=17
(2)因此N=P*Q=119
(3)选择公钥E为5
(4)选择私钥D为77
	根据这些值,考虑上图所示的加密和解密过程。这里A是发送方,B是接收方。可以看出,可以用编码机制编码字母:
	A=1,B=2······Z=26。假设用这个机制编码字母,那么B的公钥为77(A和B知道),B的私钥为5(只有B知道)

	其工作如下,假设发送方A要向接收方B发送一个字母F。利用RSA算法,字母F编码如下:
	(1)用字母编号机制,F为6,因此将F的编码为6.
	(2)求这个数与指数为E的幂,即6^5.
	(3)计算6^5 mod 119,得到41,这是发送的加密信息
	接收方用下列方法解密41,得到初始密码F:
	(1)求这个数与指数为D的幂,即41^77
	(2)计算41^77 mod 119 得到6
	(3)按照字母编号机制得到F

了解RSA的关键

     根据实例的计算,可以看出RSA算法本身很简单,关键是选择正确定的密钥。假设B要接收A的保密信息,则要生成私钥(D)和公钥(E),然后把公钥和数字N发给A。A用E和N加密消息,然后将加密信息发给B。B用私钥(D)解密消息。
     问题是,既然B能计算和求出D,别人也能计算和求出D,但并不容易,这就是RSA的关键所在。
     攻击者只要知道公钥E和数字N,好像就可以通过试错法找到私钥D,但在实际中,P和Q选择很大的数,因此要从N求出P和Q并不容易。数学分析表明,N为100位时,要70对年才能求出P和Q。

RSA的安全性

     尽管到目前为止还没有关于成功攻击RSA的报道,但未来发生攻击的可能性不是没有。下面介绍一些针对RSA的可能攻击

明文攻击
     明文攻击又进一步分为如下三个子类型。

     (1)利用较短消息的攻击。假设攻击者知道一些明文块,如果是这样,那么攻击者就可以尝试对每个明文块进行加密,看看是否能得到已知的密文。要防止这种攻击,建议在对明文进行加密之前,进行一定的防护

     (2)周期性的攻击。这里,攻击者假设密文是通过以某种方式对明文进行置换而得到的。如果这种假设成立,那么攻击者就可以进行逆向处理,即不断对已知密文进行置换操作,以获得原来的明文。但是,对攻击者来说,这里的困难是,在使用这种方法时,攻击者并不知道哪些可以认为是正确的明文。因此,攻击者不断地对密文进行置换操作,直到得到密文本身,那么攻击者就可以知道,在得到原来密文地前一步所获得的文字肯定就是原来的明文。因此,这种攻击称为周期性攻击

     (3)利用公开消息的攻击。理论上,在极少情况下,加密所得的密文与原来的明文相同!如果是这样,那么原来的明文消息就不能隐藏了。这种攻击就称为利用公开消息的攻击。因此,在利用RSA进行加密后,在把密文发送给接收方之前,应确保密文与原来的明文是不同的

选定部分密文的攻击
     这种攻击中,攻击者使用扩展欧几里得算法,基于原来的密文,找出明文。

因数分解攻击
     RSA的整个安全性是基于这样一种假设:攻击者无法把数字N分解位两个引述P和Q。如果攻击者能够从等式N = P * Q中得到P和Q,那么攻击者就可以得到私钥,如前文所述,假设N是十进制的300位数字,攻击者要找到P和Q并不容易。

对加密密钥的攻击
     当公钥E数值很小时,RSA的运行会更快,导致出现潜在的攻击,这种攻击称为对加密密钥的攻击,因此,推荐使用E为65537或接近整个数的值。

对解密密钥的攻击
     这种攻击又可以进一步分为两类:
     (1)猜解解密值数的攻击。如果攻击者能够猜测出解密密钥D,那么不仅用相应的加密密钥E加密明文所得密文的危险,甚至后面的消息也危险。为防止这种攻击,建议发送方为P,Q,N,E使用不常用的值。
     (2)对较小解密指数的攻击。类似在加密密钥中所解释的那样,为解密密钥D使用较小数,可以使RSA运行更快。这将有助于攻击者在攻击时猜测出解密密钥D。

发布了71 篇原创文章 · 获赞 3 · 访问量 4044

猜你喜欢

转载自blog.csdn.net/zouchengzhi1021/article/details/105531886