RSA是一个成熟的非对称加密技术,在1977年,由麻省理工学陆院的Ron Rivest、Adi Shamir和Leonard Adleman三人一起提出,为了纪念他们的发明,RSA由他们三人姓名的开头字母拼在一起组成。RSA是一个非常稳定,久经考验,安全性很高,简单易用的算法,目前世界上还没有任何方法可以破解一个钥匙很长的复杂RSA加密的信息。RSA是非对称加密,它不同于AES这样的对称加密算法,可以有效防止密码泄露的问题。对于去中心化开源社交软件来说,通过RSA算法建立握手连接,通过AES对数据流进行加密,是一种非常不错的方法。
本文将讨论如何通过RSA算法连接,以及它的数学原理,并给出RSA的python语言代码简单事例。RSA算法是一种公私钥算法,所以在使用RSA算法加解密信息时,会有两只存在数学关系的不同密钥,加密使用一支密钥,解密使用另一支密钥,也就是我们这里说的公钥和私钥,它们成对出现,每个人都会有自己的公私钥,公钥可以公开告诉给别人,当有人想向你发送保密信息时,可以告诉对方你的公钥,对方得到你的公钥后,然后使用这个公钥将信息加密后,回传给你,然后你通过自己的私钥解密信息,在整个传播过程,我们不需要透露自己的私钥。
例如下面通讯的两个人A和B,使用公钥加密的数据只能通过与之对应的私钥来解密,反向也是如此。
所以当A和B通信,他们互相告诉对方自己的公钥,当A向B发送数据时,A先将明文数据用B的公钥进行加密,然后将加密后的密文发送给B,B通过自己私匙来解密数据,还原为明文。
如果是B向A发送数据,那么B通过A的公钥对明文进行加密,然后将密文发送给A,A通过自己的私钥将密文还原。在这个通信过程中,通信的双方A和B均不需要透露自己的私钥给对方。
一、数学原理
两个质数的相乘的结果会得到一个数,例如,质数q * 质数p = N, 已知N这个数,求出q和p,是非常困难的。这就是RSA算法核心所在,在这里我们将N称为RSA数。
质数,只能被1和它本身整除的数,例如2、3、5、7、11、13、17等等。将两个很大质数相乘对于计算机来说是一件很容易事情,但是要将这个乘积进行分解质因数还原成两个质数就会变得十分困难。对于计算来说,计算时间随着两个质数位数增长,计算量呈指数级增长。
下面通过几个公式来看,RSA加密和解密的过程,假设一段文字,需要进行加密,那么我们将这里还没有加密的文字称为明文,加密后的文字称为密文。
1.1 RSA加密
RSA加密公式如下所示:
密文 = 明文^E mod N (mod 就是取余数的意思)
从公式中可以看出来,RSA加密就是将明文的E次方的结果除以N后,得到余数的一个计算过程。这里的E和N组合结果就是RSA加密算法中的公钥,我们使用pubKey(E,N)表示。在实际使用中,明文需要是一个小于N的数,因为加密或者解密都要mod N其结果必须小于N。
公钥 = pubKey(E,N)
1.2 RSA解密
RSA的解密