美文网首页技术
RSA算法原理

RSA算法原理

作者: 我赢了算我输 | 来源:发表于2019-03-30 15:31 被阅读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

    相关文章

      网友评论

        本文标题:RSA算法原理

        本文链接:https://www.haomeiwen.com/subject/wotsbqtx.html