RSA算法原理及其在HTTPS中的应用

来源:互联网 发布:php curl 发送请求头 编辑:程序博客网 时间:2024/06/10 18:42

本文在阅读不少他人的优秀博文以及查阅HTTPS协议和RSA等相关资料的基础上整理而成,包含了RSA算法的详细原理及其在HTTPS中的应用。RSA作为HTTPS协议中最为核心的加密/解密算法,其原理却很简单,很容易理解。当你读完本文之后,你也会惊叹于RSA算法发明者的奇思妙想。

首先,RSA的密钥越长,就越难破解。目前被破解的最长RSA密钥是768位二进制。也就是说,长度超过768位的密钥,还无法破解(至少没有人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥及其安全。下面就让我们来认识RSA算法。

一、互质关系

如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系(coprime)。比如,15和32没有公因子,所以它们是互质关系。这说明,不是质数也可以构成互质关系。关于互质关系,有如下结论:

  • 1、任意两个质数构成互质关系,如13和61;
  • 2、一个数是质数,另一个数只要不是前者的倍数,则两者构成互质关系;
  • 3、如果两个数之中,较大的那个数是质数,则两者构成互质关系,如97和57;
  • 4、1和任意一个自然数都是互质关系,比如1和99;
  • 5、p是大于1的整数,则p和p-1构成互质关系,如57和56;
  • 6、p是大于1的奇数,则p和p-2构成互质关系,如17和15。

二、中国余数定理

原本RSA算法和中国余数定理没有什么直接的联系,但即将介绍的欧拉函数的证明需要用到中国余数定理,固在这里先行介绍一下。
中国余数定理:给出m个两两互质的整数,且它们的乘积为P。假设有一个未知数M,如果我们已知M分别除以这m个数所得的余数,那么在0到P1的范围内,我们可以唯一地确定这个M。这个值可以看作是M的一个特解。其它所有满足条件的M,则正好是那些除以P之后余数等于这个特解的数。

从某种角度来说,中国余数定理几乎是显然的。让我们以两个比较小且互质的整数3和4来理解中国余数定理背后的直觉。其中xmody表示x除以y的余数。

中国余数定理的理解

从表中可以看到,imod3的值以3位周期在循环,而imod4则以4为周期在循环。由于3和4是互质的,它们的最小公倍数为12,因而(imod3, imod4)的循环周期是12,不会更短。因此,当i从0增加到11时,(imod3, imod4)的值始终没有重复出现。同时,(imod3, imod4)也只有12种不同的取值,即当i从0增加到11时,(imod3, imod4)i之间存在一一映射。这就是中国余数定理的内容。

三、欧拉函数

请思考以下问题:任意给定正整数n,请问在小于等于n的正整数中,有多少个与n构成互质关系?

计算这个值的方法就叫做欧拉函数,以φ(n)表示。在1~8中,与8形成互质关系的是1,3,5,7,所以 φ(8)=4

φ(n)的计算方法并不复杂,但为了得到最后的公式,我们需要分以下五种情形讨论:

  • 第一种情况:

    n=1,则φ(1)=1,因为1与任何数(包括自身)构成互质关系。

  • 第二种情况:

    n是质数,则φ(n)=n1。因质数与小于它的每一个数都构成互质关系。

  • 第三种情况

    如果n是质数的某个次方,即n=pkp为质数,k为大于等于1的整数),则φ(pk)=pkpk1。这是因为只有当一个数的因子不包含质数p,才能与n互质。而因子包含质数p的数一共有pk1个(1×p2×ppk1×p),把它们去除,剩下的就是与n互质的数。
    上面的式子还可以写成φ(pk)=pk(11p)。可以看出,第二种情况是第三种情况中k=1的特例。

  • 第四种情况

    如果n可以分解成两个互质的整数之积,即n=p1p2,则φ(n)=φ(p1p2)=φ(p1)φ(p2),比如φ(56)=φ(8×7)=φ(8)φ(7)=4×6=24

    其实这条结论用“中国余数定理“就很好理解了。简单说下思路:如果ap1互质(a<p1),bp2互质(b<p2),cp1p2互质(c<p1p2),则c与数对(a,b)是一一对应关系。由于aφ(p1)种可能,b的值有φ(p2)种可能,则数对(a,b)φ(p1)φ(p2)种可能。而c的值有φ(p1)φ(p2)种可能,所以φ(n)=φ(p1p2)=φ(p1)φ(p2)

    补充说明:我们还可以证明一种更加特殊的情况:如果n可以分解为两个质数之积,即n=p1×p2p1p2为质数),那么φ(n)=φ(p1p2)=φ(p1)φ(p2)。证明这如下:

    证明:
    p1p2为质数,
    p1p2不互质的数必然包含p1p2
    包含p1p2的数有:
    1×p1,2×p1,,p2p1,1×p2,2×p2,,p1p2
    由第二种情况知,φ(p1)=p11φ(p2)=p21,即φ(n)=φ(p1p2)=φ(p1)φ(p2)
    证毕。

  • 第五种情况

    因为任意一个大于1的正整数,都可以写成一系列质数的积:n=pk11pk22pkrr,根据第四种情况,有φ(n)=φ(pk11)φ(pk22)φ(pkrr),再根据情况三,有:φ(n)=pk11pk22pkrr(11p1)(11p2)(11pr),这就是欧拉函数的通用计算公式。
    比如1323的欧拉函数:φ(1323)=φ(33×72)=1323×(113)(117)

四、欧拉定理

欧拉函数的用处,在于欧拉定理:如果两个正整数an互质,则可以证明n的欧拉函数φ(n)满足下面的等式:

aφ(n)1modnaφ(n)%n=1

也就是说aφ(n)次方被n除余数为1。
欧拉定理还有个特殊情况:
假设正整数a与质数p互质,因φ(p)=p1,则ap11modp。这就是著名的费马定理。
费马定理是欧拉定理的特例,而欧拉定理是RSA的核心。

在证明欧拉定理之前我们需要先介绍消去律。

  • 消去律
    如果gcd(p,q)=1,则apmodq=bpmodqamodq=bmodq
    其中gcd(p,q)函数表示求pq的最大公约数。
    消去律非常简单,这里就不再进一步证明了。下面就用消去律来证明欧拉定理。

    证明:
    第一步,假设小于n且和n互质的数构成的集合为Zn,则|Zn|=φ(n)。再令Zn={x1,x2,,xφ(n)}S={ax1modn,ax2modn,,axφ(n)modn},那么我们可以证明Zn=S,理由如下:
    首先,显然有|Zn|=|S|;
    然后,因为an互质,xi(1iφ(n))n互质,所以axin互质,所以aximodnZn
    最后,假设ij,那么xij,且由an互质可得axjmodnaxjmodn(消去律)。
    第二步,由第一步的结论我们有如下推导:
    aφ(n)x1x2xφ(n)modn
    ((ax1)(ax2)(axφ(n)))modn
    (ax1modn)(ax2modn)(axφ(n)modn)
    x1x2xφ(n)modn
    对比等式的左右两端,因为xi(1iφ(n))n互质,所以aφ(n)1modn(消去律)。
    证毕。

五、模反元素

如果两个正整数an互质,那一定可以找到正整数b ,使得:ab1(modn),这时b 就叫a的”模反元素”。比如,3和11互质,那3的模反元素是4,因为3×4%11=1。显然,模反元素不止一个,4加减11的整数倍都是3的模反元素。即若ba的模反元素,则b+kn都是a的模反元素。
欧拉定理可以用于证明模反元素必然存在:

aφ(n)=aaφ(n1)1(modn)
可以看到aφ(n)1次方就是a的模反元素。

六、密钥生成步骤

AB通信:
第一步,随机选择两个不相等的质数pqA选择61和53(实际中,这两个质数越大,就越难破解)。
第二步,计算pq的乘积nn=61×53=3233n的长度就是密钥的长度。3233的二进制是110,010,100,001,一共有12位,所以密钥的长度为12位。实际应用中,RSA一般是1024位,重要场合为2048位。
第三步,计算n的欧拉函数φ(n)φ(n)=(p1)(q1)=60×52=3120
第四步,随机选择e,条件是1<e<φ(n),且eφ(n)互质。 随机选择了17(在实际应用中,常选择65537)。
第五步,计算eφ(n)的模反元素ded1(modφ(n)),于是找到模反元素d,实际上就是对下面一个二元一次方程求解:

ex+φ(n)y=1,e=17,φ(n)=3120.
这个方程可用”扩展欧几里得”求解,总之求解为(x,y)=(2753,15),即d=2753
第六步,将ne封装成公钥,nd封装成私钥。在A的例子中,n=3223e=173573,所以公钥是(3233,17),私钥就是(3233,2753)

七、可靠性

回顾密钥的生成步骤,一共出现了六个数字:pqnφ(n)ed。这六个数字中,公钥用到了ne,其余四个都是不公开的。其中最关键的是d,因为nd组成了私钥,一旦d泄露,就等于私钥泄露。那么,有无可能在已知ne的情况下,推导出d呢?分析如下:

  • ed1(modφ(n)),所以只有知道eφ(n),才能算出d
  • φ(n)=(p1)(q1),所以只有知道pq,才能算出φ(n)
  • n=pq,所以只有将n因数分解,才能算出pq

结论:如果n可以被因数分解,d就可以算出,也就意味着私钥被破解。可是,大整数的因数分解是一件非常困难的事情。目前,除了暴力破解,没有其他有效的方法。

八、加密和解密

  • 1. 加密用公钥(n,e)

    B要向A发送信息m,他用A的公钥(n,e)m进行加密。这里需要注意的是,m必须是正数(字符串可以取ascii值或Unicode值)且m必须小于n。所谓“加密”,就是算出下式中的cmec(modn)A的公钥是(3233,17)Bm假设是65,则65172790(mod3233),即c=2790

  • 2. 解密用私钥

    A拿到2790后,用(3233,2753)进行解密,稍后我们将证明cdm(modn)一定成立。
    说明:对于m>n时,有两种解决办法:一种是把长信息分割成若干短消息,每段分别加密;另一种是先选择一种“对称加密算法”,如DES,用这种算法对信息进行加密,再用RSA对DES加密。

九、私钥解密的证明

  • 即证明cdm(modn)成立。

    证明:
    mec(modn)
    c=mekn,则cd=(mekn)d
    则等价于要证明:medm(modn)
    ed=hφ(n)+1med=mhφ(n)+1
    即等价于证明:mhφ(n)+1m(modn)
    分两种情况讨论:
    (1)mn互质时,由欧拉定理:mφ(n)=1(modn)mhφ(n)+1=m(mφ(n))hm(modn)
    (2)mn不是互质关系时,由于n为质数pq的乘积,所以必然有m=kp或者m=kq。不妨假设m=kp,其中1k<q(因为前面已经假定m<n,所以1k<q),则此时kq必然互质(因为1k<q,且q为质数,则比q小的任意正整数都与q互质),由此可知,mq必然互质。根据欧拉定理:mφ(q)=mq11(modq)
    从而mhφ(n)=(mq1)h(p1)1(modq),于是存在正整数s,使得mhφ(n)=1+sq。此式两边分别乘以m=kp,则mhφ(n)+1=m+skn,从而cd=mhφ(n)+1m(modn)
    证毕。

十、RSA运算相关的问题

  • 问题一:如何处理大数运算?
  • 问题二:如何求解同余方程xy%n=1
  • 问题三:如何快速进行模幂运算?
  • 问题四:如何获取大质数?

实际上,在实现RSA算法的过程中发现,问题二、三、四不是各自独立的,而是互有关联。

问题一的解决思路:将大数表示为一个n进制数组,对目前的32位系统而言,n最大值可以取值2的32次方减一,即取值范围为0~(2321)。将一个1024位的大数转化为该n进制。该n进制下每一个符号就用一个32位的字(Dword)来表示。对该n进制的运算不过就是循环地对每一个符号对应的32位的字进行运算而已。

问题二:有欧几里得、辗转相除法等。

问题三:模幂运算是RSA的核心算法,最直接地决定了RSA算法的性能。针对快速模幂运算这一课题,西方现代数学家提出了大量的解决方案,通常都是先将模幂运算转化为模乘运算。例如,求D=C15%N等式中D的值:
由于ab%n=(a%n)(b%n)%n
所以C1=CC%N=C2%N
      C2=C1C%N=C3%N
      C3=C2C2%N=C6%N
      C4=C3C%N=C7%N
      C5=C4C4%N=C14%N
      C6=C5C%N=C15%N
而对于ab%n,如果A和B都是1024位的大数,那么ab就是2048位,所以要避免ab运算。由上面的例子可知,我们可以将多位乘法转换为一系列单位乘法和加法,即

{ab%n=(a%nb%n)%n(a+b)%n=(a%n+b%n)%n

到此,我们已经将模幂运算转换成了模乘运算的循环,那么要进一步提高RSA算法的效率,还需要提高模乘运算的效率。模乘过程中复杂度最高的环节是求模运算,因为一次除法实际上包含了多次加法、减法和乘法,如果在算法中尽量避免除法,则算法你效率会大大提高。著名的蒙哥马利算法是不含除法的模幂算法。

问题四:质数测试是RSA取密钥的第一步,但奇妙的是,其核心运算与加解密时所需的运算完全一致,即都是模幂运算。而模幂运算过程所需求解的欧几里得方程又恰恰是选取密钥第二步所需的运算。

十一、RSA在通信中的应用

RSA算法让双方可以在不安全的通信线路上进行秘密地通信,一切看上去似乎完美了。但在实际的应用中,我们还需要解决另外一个问题——中间人攻击:在A、B两人建立会话的过程中,攻击者很容易在线路中间操纵信息,让A、B两人误以为他们是在直接对话。让我们来看看这具体是如何操作的:

建立会话时,A首先呼叫B并索要B的公钥,此时,攻击者注意到了这个消息,当B将公钥传给A时,攻击者截断B的公钥,然后把攻击者自己的公钥传给A。接下来,A就给出了自己的密码,比如314159,然后用它收到的公钥进行加密,并将加密后的结果传给B。A以为他用的是B的公钥,但实际上他用的是攻击者的公钥。攻击者截获A传来的信息,用自己的私钥解出314159,再把314159用B的公钥加密后传给B。B收到信息后不会发现有什么异样,因为这段信息确实能用B的私钥解开,而且确实是314159(通过数据库匹配)。今后,A、B将会用314159作为密码进行通话,而完全不知道攻击者已掌握了密码。

怎么封住这个漏洞呢?我们得想办法建立一个获取对方公钥的可信渠道。一个简单而有效的办法是,建立一个所有人都信任的权威机构,由该机构来存储并分发大家的公钥。这就是我们通常所说的数字认证机构,英文是Certificate Authority,简称CA。任何人都可以申请把自己的公钥放到CA上去,不过CA必须亲自简称申请者是否符合资格。如果A想要和B建立会话,那A就直接从CA处获取B的公钥,这样就不用担心得到的是假公钥了。

新的问题又来了,怎么防止攻击者冒充CA呢?CA不但需要向A保证“这个公钥确实是B的”,还要向A证明,我确实是CA。

CA如何证明自己是CA呢?用“数字签名”。数字签名能够保证数据传输的完整性、发送者身份验证以及防止交易中的抵赖行为。

十二、数字签名及数字证书

这部分内容我本来打算自己写的,直到有一天我发现了一篇博文:一个故事教你看懂什么是数字证书,这篇博文用非常生动形象的例子解释了数字签名、数字证书以及HTTPS的工作原理,我这里如果再重复赘述就没有什么意义,想了解RSA算法在HTTPS中具体是如何应用的,强烈推荐这篇博文。

十三、相关链接

  • RSA算法原理
  • 跨越千年的RSA算法
  • HTTPS是如何保证连接安全:每位Web开发者都应知道的
    完结。

原创不易,如果你觉得本文对你有帮助,希望你能支持一下~

这里写图片描述

0 0
原创粉丝点击