欢迎转载,但请指明出处:https://www.cnblogs.com/zhizaixingzou/p/10241100.html

 

RSA算法是三位数学家Rivest、Shamir和Adleman于1977年设计出来的,关于RSA算法的原理有文章已讲得很清晰,请见:

http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

 

1)生成密钥对的过程

随机选择两个不相等的质数p和q。

n=p*q。n的二进制表示的位数即密钥长度。

φ(n)= φ(p)* φ(q)=(p-1)*(q-1)。此等式源自于两个数论规律,其一互质的两个数的积的欧拉函数值等于两个数的欧拉函数值的积,其二质数的欧拉函数值比该质数少1。

随机选择一个整数e,满足1< e < φ(n),且e与φ(n) 互质。

找到一个整数的,满足ed ≡ 1 (mod φ(n))。

(n, e)即为公钥,(n, d)即为私钥。

 

2)加解密的过程

假设加密使用公钥。发送方握有的公钥是(n, e),要加密的是整数m。m必须小于n。

通过me ≡ c (mod n)得到的整数c就是密文。

接收方握有的私钥是(n, d),他或她接收到了整数c。

通过cd ≡ m (mod n)得到的整数m就是发送方实际发送的明文。

 

加密实际上是针对小于n的整数来的,这是前提。

但如果n是1024位(128字节),那么m也可以足够大,通常可以选择64字节表示。也正因为如此,一段长消息,我们将它编码为字节数组,然后每64字节成为一个整数,逐个整数加密,得到的密文整数也为固定个数的字节来表示,解密就按此固定字节数逐个完成后在拼接。

另外,之所以这样加解密是成立的,在于me ≡ c (mod n)和cd ≡ m (mod n)互为充分必要条件,即互相可以推到出。显然,反过来使用私钥加密、公钥解密也是成立的,它们的形式也具有完美的对称性。

 

3)算法的安全性

密钥对生成的过程中共出现5个数字p、q、n、e和d,它的安全性在于对d的保密:

ed ≡ 1 (mod φ(n))。要得到d,需要知道φ(n)。

φ(n)=(p-1)(q-1)。要得到φ(n),需要知道p和q。

n=pq。要得到p和q,需要对n进行质因数分解。

 

通过这个过程,提示我们要做到三点:

其一,妥善保管秘钥,只能自己知道。

其二,对极大整数的质因数分解是足够难的,这个依赖于数学规律的不被发现。而我们要做或者说能做的是满足这个前提,即选取的p和q应该足够大。

其三,在数学规律不被发现的情况下,也可以通过暴力破解(也就是指定n,不断假设p,到q是整数且与p互质),为了增加破解的难度,也要求n=p*q足够大。

总之,该算法被证明非常可靠,而且密钥越长则越难破解,常用1024位,更高等级的安全性要求中则使用2048位。

posted on 2019-01-08 19:56  Firefly(萤火虫)  阅读(2145)  评论(0编辑  收藏  举报