技术

RSA算法原理

2019-03-30  本文已影响0人  我赢了算我输

RSA 简介


RSA是一种非对称性加密算法,现在算是最具有影响力的算法,简单来说RSA运用了"一个大整数进行因式分解具备一定的难度"这个数学知识来进行加密,对一个极大整数做因式分解越难,那么想要破解加密过后的密码就越难。在讲RSA算法之前,先要学习几个知识点,下面会一一讲解。

整数因子

如果一个整数N能被负N到N之间(包括负N和N)中的整数整除,那么这个数就是这个整数的整数因子

举个栗子:求4的因子
能将4整除的有-4,-1,-2,1,2,4 那么4的因子就是 {-4,-1,-2,1,2,4 }

公因子

一个整数的因子集合A和另一个整数的因子集合B存在交集(A∩B),那么这个交集里面的元素就是这两个整数的公因子

也举个栗子:求4和6的公因子。
上面已经算出了4的因子集合(A),即{-4,-1,-2,1,2,4 },6也可以算出来,这里直接给出答案,6的因子集合(B)
是{-6,-3,-2,-1,1,2,3,6}
那么A和B的交集(A∩B)C={-2,-1,1,2},集合C就是4和6的公因子

互质关系

如果两个整数除了1以外没有其它公因子,那么我们就称这两个整数有互质关系(不考虑公因子为负数的情况)

例子:证明9和10是否是互质关系。
首先,先要求出9和10的公因子,这里不进行一步步计算,看官可以通过上述的知识点自己算算,看是否与下面数据相同 9的因子集合A为{-9,-3,-1,1,3,9}
10的因子集合B为{-10,-5,-2,-1,1,2,5,10}
那么9和10的公因子A∩B={-1,1},而证明互质关系不考虑负数的情况,所以公因子为{1}
所以9和10是互质关系。
(PS:两个素数(质数)都是可以为互质关系)

欧拉函数

欧拉函数可以用来解决"给定任意一个整数N,那么小于N或等于N的整数中,有几个和N是互质关系",可表示为φ(N)

例子:φ(8)是多少
在小于或等于8之中,只有1,3,5,7和8是互质关系,所以φ(8)={1,3,5,7}=4

这里只需要知道几个知识点就够了,没必要把欧拉函数全部给理解了。
第一个:
当整数N为素数(质数)的时候,那么φ(N)=N-1。 为什么呢?因为素数的定义是除1和自身以外,不存在因子。所以N除自己以外,都是和N是互质关系。即N-1。

第二个是:如果这个整数N可以用两个素数相乘得到,即N=P1*P2,那么φ(N)=φ(P1 * P2)=φ(P1)φ(P2),证明这个式子需要用到“中国剩余定理”,这里不进行证明,知道就行。

欧拉定理

当两个整数A,B是互质关系的时候,那么A的φ(A)次方除于N除余必然是一

图片来自百度百科

例子:求9和10
φ(9)=6;
φ(10)=4;
那么9的φ(9)次方为 9^6=531441,然后531441除于10为53144余1。

这个公式也不进行证明,只需要记住结论就好了。

模反元素

如果两个整数A和B为互质的话,必然存在一个C,使得AC除于B余1,那么C就是A的模反元素

在这里插入图片描述

例如:证明整数5和11,5的模反元素是9
因为5*9-1为44,而44正可以给11整除,所以9是5的模反元素。

到这里,基本知识点就学完了,下面学习RAS的加密过程

1.选取两个较大的质数,求乘积N

这里我选取41和43,那么乘积N=41*43=1763,N的长度就是密钥的长度,1763转换成二进制是11011100011,11位,所以密钥的长度就是11位。
(PS:一般来说RSA密钥的长度为1024位,重要的话为2048位)

2.算出φ(N)

因为N是由两个质数相乘得到,根据上面欧拉函数的知识点,那么φ(N)=φ(P1P2)=(41-1)(43-1)=40*42=1680

3.选取一个e,e的范围是1<e<φ(N),并且和φ(N)是互质关系

这里选取17作为e(PS:一般1024位或2048位会用65537作为e)

4.算出e和φ(N),e的模反元素,也就是要满足 ed ≡ 1 (mod φ(n))

把上面公式转换下可以变成ed-1=φ(n)k (d为模反元素,k为φ(n)的倍数)
然后转化成一元二次方程式:ed+φ(n)
k =1,可以通过扩展欧几里得算法来算出d和k,扩展欧几里得算法是辗转相除法得进化版。
我这里使用C语言求出d和k

C语言

这里得出<kbd>d=593,k= - 6</kbd>,所以593就是e和.φ(N),e的模反元素。 到这里,全部基础计算就结束了,接下来,是使用这些基础来进行RSA的加密。

挑选作为私钥和公钥的数字.

在RSA中,d(e的模反元素)是至关重要的,如果d暴露了,那么RSA的破解就变得很容易了,这里选用(N,d)作为私钥,(N,e)作为公钥 公钥:(1763,17) 私钥:(1763,593)

那么在知道公钥N和e的情况下,能否算出d呢?

上面含有d的公式是<kbd>ed=φ(N)k+1,那么,想要知道d,那么必须知道φ(N),而φ(N)=φ(P1*P2)
这里有两种情况。

1.知道P1和P2

这种情况不太可能,除非是参与了设计RSA加密的人员,emmmm那么问题来了,自己破解自家的加密?而且一般来说,设计P1和P2的数会很大,而不是像我举例的41和43那样。


图来自阮一峰的文章

2.将N因式分解(即暴力破解)

这里就解释了为什么RSA会运用"一个大整数进行因式分解具备一定的难度"这种问题来进行加密,如果要破解的话,没有一台计算力强的机器是不可能破解的。

加密公式 C=M^e (mod N) 或者是 C=M ^E-NK

m代表明文,e和N是我们上面求出来的,K是N的倍数,目的就是要算出c

解密公式 C^d ≡ M (mod N)或者 M=C ^d-NK

C是加密过后的数字,N和d在上面已经求出,K是N的倍数,目的就是要算出M

至于为什么加密要采用这条公式,我也不太清楚,如果有人知道,望告知,而解密公式为什么可以正确的算出M呢?这个可以看下面阮一锋大大的文章。

参考文章:

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

上一篇下一篇

猜你喜欢

热点阅读