现在的位置: 首页 > 综合 > 正文

加密算法[2]:RSA

2013年10月09日 ⁄ 综合 ⁄ 共 1430字 ⁄ 字号 评论关闭

 

 

 

 

正如DES作为对称算法的典范一样,RSA在非对称算法中一直处于主导地位。

RSA加密算法中,对明文的加密以及对于密文的解密分别使用不同的密钥,这也是非对称算法这个称呼的由来。我们把这两个不同的密钥叫做公钥Kpublic以及私钥Kprivate。公钥可以公开给任何人,而私钥则需要保存在一个秘密的地方,比如放在可以防止攻击的智能卡等类似的安全设备中。

RSA是三个发明这一算法的大师名字的缩写,在Google中随意搜索都可以知道,他们的名字是:Ronald L. Rivest, Adi Shamir, and Leonard Adleman

RSA的基本原理是大整数分解的难题,其中涉及到一些数论的概念和定理,尤其是著名的尤拉定理。但是从应用的角度看,其实也很简单,也就是在知道两个整数的积的情况下,很难知道这个积究竟是哪两个整数相乘得到的。

首先看怎么设计密钥:

先找两个足够大的素数PQ(通常要大于1024位,而16位数据相当于十进制的6万多,那么1024位相当于646万相乘,必须用科学技术法才能表达出来了);

然后计算出n=P*Qz=(P-1)*(Q-1),其中我们把n叫做模数;

选择一个小于z的数e,要求ez之间没有公约数;

再找一个d,使得e*d-1可以被z整除,换句话说e*d除以z应该余1

于是把(n,e)设定为公钥,把(n,d)设定为私钥。其中n叫做模数,e叫做公钥指数,d叫做私钥指数。

 

其中PQ是找出来的,必须要保密。但是n=P*Q是计算出来的,要公开;而e是找出来的,要公开,d是计算出来的要保密。

 

所以其中的关键点就是即使别人知道了ne但是不能因此推导出PQ以及d

 

假设明文是M密文是C,那么加密和解密的过程为:

C=Me mod n (加密过程)

M=Cd mod n (解密过程)

也可以表述为:M=(Me mod n)d mod n。其中的 mod表示为求模运算,说白了就是计算余数而已。从中可以看到de在计算中被用作指数来使用的,而n被用作模数。

 

我们可以通过一个简单的例子说明这个貌似复杂的过程:

任意找两个素数:P=3Q=7(为了计算简单,就不用费劲去找1024位的大素数了);

计算n=P*Q=3*7=21z=(P-1)*(Q-1)=2*6=12

找一个小于12并且和12没有公约数的数,比如5,于是e=5

找一个数d使得d*e除以121,比如d=17,这样17*5=85,而85除以12刚好余1。于是我们就得到了公开密钥(521)和私有密钥(1721)。

 

我们对数据9加密,那么密文就是95 mod 21=59049 mod 21=18

我们对于18进行解密,那么明文就是1817 mod 21=2185911559738696531968 mod 21=9

当然被加密的数据一定要小于21,否则计算的出来的结果应该是模21之后的数据。比如如果对数据25进行加密,那么密文是255 mod 21=9765625 mod 21=16,而对16解密后得到的密文是1617 mod 21=295147905179352825856 mod 21=4,也就是2521的结果,而不会是25

对于支持RSA算法的智能卡而言,可以实现密钥对的生成,以及RSA加密和解密的功能。根据智能卡性能的不同,密钥对生成所需要的时间也差别很大。在生成密钥对的时候通常会用到中国余数定理CRT,对于1024位的RSA密钥,通常在十几秒钟到数十秒钟不等,有些智能卡甚至要用几分钟的时间去生成密钥。

 

抱歉!评论已关闭.