RSA算法详解

测试产品的时候,对签名跟认证很是熟悉。但是对RSA的原理,以及秘钥的关系还是有原理性方面的欠缺。
本文梳理下RSA的加解密流程,以及秘钥的对应关系
关于RSA的认证跟加密的应用,采用如下的方式
认证:私钥签名,公钥认证
加密:公钥加密,私钥解密

RSA算法流程

RSA算法的的原理简单来说就是将一个很大的质数M,很难分解为两个质数a,b,并且a*b=M

详解请参照:
http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

  • 生成秘钥

    1. 选择两个不相等的质数p,q
    2. 计算p,q的乘积n
    3. 计算n的欧拉函数φ(n)=(p-1)*(q-1),计算出来的值就是不大于n且与n互质的整数个数
    4. 选择一个与φ(n)互质的整数e,且1<e<φ(n)
    5. 计算e对于φ(n)的模反元素d,计算公式d*e≡1(mod(n))。
    6. 公钥(n,e),私钥(n,d)。
    7. 销毁p,q
  • 加解密

    • 加密
      • 发送方向接收方发送明文信息m,发送方使用公钥(n,e)依照如下公式加密:
        m^e=c(mod n)
        m必须是整数,且小于n。根据上面的公式可以算出密文C
    • 解密
      • 接收方获取密文c,使用自己的私钥(n,d)依照如下公式解密
        c^d=m(mod n)
        c,d,n已知,可以算出明文m

从上面的秘钥生成流程中,我们可以发现
如果p,q都销毁了,很难通过公钥(n,e)获取私钥(n,d).反之亦然。以为公式中的φ(n)=(p-1)(q-1),通过n很难得到p,q是本算法的基础
但是通常我们使用的tool生成的私钥中,包含了公钥信息。所以可以通过私钥获取公钥

示例

  1. 随机选择两个不相等的质数47和59
  2. 二者的乘积为43×57=2773,2773转化为二进制为1010,1101,0101,长度为12位,所以密钥的长度为12位
  3. 根据欧拉函数公式φ(n)=n(1-1/p)(1-1/q)计算,φ(2773)= 2773×(1-1/47)(1-1/59)=(47-1)(59-1)=2668
  4. 随机选择一个整数e=63,2668>63>1,并且63与2668互质
  5. 计算63对于2668的模反元素d,根据公式ed≡1(mod φ(n)),有63d-1=2668k,由欧几里得扩展公式计算d=847
  6. 公钥(n,e)=(2773,63),私钥(n,d)=(2773,847)

  • 加密
    根据上面计算出的公钥(n,e)=(2773,63),假如m=244,根据公式m^e=c(mod n),可计算出密文c=465
  • 解密
    根据上面计算出的私钥(n,d)=(2773,847),已知c=465,根据公式c^d=m(mod n),可计算出明文m=244
原文地址:https://www.cnblogs.com/richard-xiong/p/9923283.html