非对称加密RSA算法俗解

Posted 寂默心流

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非对称加密RSA算法俗解相关的知识,希望对你有一定的参考价值。

  眼看量子计算就要实现了,目前最火的非对称加密RSA算法就要寿终正寝了,我们还是知道一下这个红极一时并得到广泛应用的加密方法是咋回事吧,以为缅怀。经典的加密是用一个密钥比如DES密钥对明文加密,然后把密文和密钥发给接收方,接收方用密钥解密密文。这种传统的办法最大的问题是密钥(包括传统的密码本)的传递并不安全,容易被敌方窃听,劫持等,而且密钥需要定期更换,这又面临分发的风险。RSA算法加密的东西就很厉害了,它先用一个办法生成一对公钥和私钥,公钥可以公开,也就是我们下载的种种数字证书,而私钥则由自己好好保存。然后大大方方地把公钥发给发送方,让它用公钥加密文件,发给接收方,接收方可以用秘不示人的私钥解密。别人明明知道密文是什么,和加密的密钥是什么,但就是因为没有与公钥成对的私钥而无法解密,干瞪眼!

  那么如何生成一对神奇的公钥和私钥呢,原理如下:

  第一步,随机选择两个不相等的质数p和q。比如61和53。(实际应用中,这两个质数越大,就越难破解。)

  第二步,计算p和q的乘积n。本例中n = 61×53 = 3233。n的长度就是密钥长度。3233写成二进制是110010100001,一共有12位,所以这个密钥就是12位。实际应用中,RSA密钥一般是1024位,重要场合则为2048位。

  第三步,计算n的欧拉函数φ(n)。根据公式:φ(n) = (p-1)(q-1),本例中φ(3233)=60×52=3120。

  第四步,随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质(也即他们的公约数只有1)。本例在1~3120中随机选择了17。(实际应用中,常常选择65537。)

  第五步,计算e对于φ(n)的模反元素d。所谓“模反元素”就是指有一个整数d,可以使得ed被φ(n)除的余数为1。实质上就是对下面这个二元一次方程求整数解。
 

代码: 全选

 ex + φ(n)y = 1

  本例中 e=17, φ(n)=3120,方程即为
  

代码: 全选

17x + 3120y = 1

  这个方程可以用“扩展欧几里得算法”求解,本例算出一组整数解为 (x,y)=(2753,-15),即 d=2753。

  至此所有计算完成。

  第六步,将n和e封装成公钥,n和d封装成私钥。本例中,n=3233,e=17,d=2753,所以公钥就是 (3233,17),私钥就是(3233, 2753)。

  公钥和私钥的用法:

  (1)加密要用公钥 (n,e)

  如果要发送信息m,就用接收方发来的公钥 (n,e) 对m进行加密。这里需要注意,m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。所谓”加密”,就是算出下式的c:
  

代码: 全选

m^e ≡ c (mod n)

  本例的公钥是 (3233, 17),鲍勃的m假设是65,那么可以算出下面的等式:
  

代码: 全选

65^17 ≡ 2790 (mod 3233)

  也即65的17次方除以3233的余数,本例中余数c等于2790,发送方就把加密后的密文2790发给了爱丽丝。

(2)解密要用私钥(n,d)

  接到密文2790以后,接收方用自己的私钥(3233, 2753) 进行解密。可以证明,下面的等式一定成立:
  

代码: 全选

c^d ≡ m (mod n)

  现在,c等于2790,私钥是(3233, 2753),那么,爱丽丝算出
 

代码: 全选

2790^2753 ≡ 65 (mod 3233)

  也即密文2790的2753(参数d)次方除以公钥3233(参数n)的余数就是加密前的原文是65。

  至此,”加密–解密”的整个过程全部完成。
http://blog.jobbole.com/42699/

  更神奇的是,这个加密算法不但完成文件的加密解密,还能完成电子签名。也即发送方也可以生成自己的一对公钥和密钥,并把公钥发给接收方,发送方在发送密文的同时,也用自己的私钥(注意是私钥,不是公钥)加密一段签名,接收方收到发送方的签名密文后,用先前收到的发送方公钥解密,就可以唯一地确定发送方没问题,因为如果签名被伪造,那么用他的公钥无法完成解密。

  实际的用法还要复杂一些,具体如下:

  1)客户A准备好要传送的数字信息(明文)。  


  2)客户A对数字信息进行哈希(hash)运算(一种得到数字指纹的算法,一段文字只能得到唯一的hash值,且改动原文任何一点点就会完全改变hash值,无法伪造),得到一个信息摘要。


  3)客户A用自己的私钥(SK)对信息摘要进行加密得到客户A的数字签名,并将其附在数字信息上。  


  4)客户A随机产生一个加密密钥(DES密钥),并用此密钥对要发送的信息进行加密,形成密文。


  5)客户A用双方共有的公钥(PK)(此公钥是银行B的)对刚才随机产生的加密密钥进行加密,将加密后的DES密钥连同密文一起传送给乙。  


  6)银行B收到客户A传送过来的密文和加过密的DES密钥,先用自己的私钥(SK)对加密的DES密钥进行解密,得到DES密钥。  


  7)银行B然后用DES密钥对收到的密文进行解密,得到明文的数字信息,然后将DES密钥抛弃(即DES密钥作废)。  


  8)银行B用双方共有的公钥(PK)(此公钥是客户A的)对客户A的数字签名进行解密,得到信息摘要。银行B用相同的hash算法对收到的明文再进行一次hash运算,得到一个新的信息摘要。  


  9)银行B将收到的信息摘要和新产生的信息摘要进行比较,如果一致,说明收到的信息没有被修改过。

http://www.cnblogs.com/jackyrong/archiv ... 72945.html

  可见,由于该加密技术有正文必须短于公钥长度的限制,所以在以上的实际应用中是对加密正文的DES密钥进行加密,接收方解密得到DES密钥,再用它对正文进行解密。这就突破了正文不得长于公钥的限制。需要加密的正文中的字母和字符要先转换为ASCII码。  

  这个加密算法的核心是公钥那一对数字巨大无比的质因子p和q!如果在有效的时间内没法对公钥进行因子分解,找不到p和q,就没法破解密文。不久的将来,量子计算机可以在有效的时间内对公钥大数完成因子分解,就可以破解这个算法。所以,量子计算机是这个算法的克星。

  走好,RSA!


以上是关于非对称加密RSA算法俗解的主要内容,如果未能解决你的问题,请参考以下文章

技术 | RSA非对称加密算法详解

非对称加密算法-RSA算法

openssl 非对称加密算法RSA命令详解

一文详解非对称加密算法之RSA算法

python----RSA非对称加密算法使用

CWE-780:RSA算法未使用最优非对称加密填充漏洞