Https中公私钥加密算法和其使用的RSA算法分析

542 阅读6分钟

学习Https原理的过程中,对公钥证书和私钥证书交换的过程、公钥算法、公钥证书、RSA算法进行了的学习。下面主要是对公钥加密和RSA算法的分析。分析过程并没有覆盖https的方方面面,只是自己的一个笔记,希望在公私钥加密中使用的RSA算法方面,能对大家有所帮助。

Public Key Encryption(公钥加密)

公钥加密有两种用途:

Public key encryptography accomplishes two functions:

  1. authentication which is when the public key is used to verify that a holder of the paired private key sent the message.
    认证过程https中APP客户端通过公钥证书中的publicKey验证服务器是否是希望访问的服务器。
  2. encryption whereby only the holder of the paired private key can decrypt the message encrypted with the public key.

公钥加密和数字签名的区别

公钥加密(public key encryption) 和 数字签名(digital signatures)不是一回事,他们是两种不同的公钥加密算法(public key encryptography)。

  1. 公钥加密(public key encryption)
  • 作用:
    • 加密 key pair的所有者(sender,S)将public key发送给使用者(recipient,R),R使用public key加密需要传送给S的消息,然后发送给S。这个消息因为使用了public key进行了加密,任何人都不可能解密消息,除了private key的所有者S。这就保证了消息的安全性。
  • 缺陷:
    public key encryption本身并不能完成以下事项:
    • 不能保证使用者拿到的是真正sender的public key,有可能拿到的是MITM攻击者的public key。
    • public key并不用来对sender发出的消息进行任何处理,所以public key与sender所发出消息的安全性没有关系,即不能通过public key保证发送给R的消息不被破解
    • public key仅用来加密R发送回S的消息,保证发送回的消息是不能被破解的。
    • public key和消息是一起发送给对方的,无法保证public key和消息是原配,中间过程中两个东西有可能其中一个被篡改了。 综上所述,如何保证给到使用者的public key是真的,以及所有者发送给使用者的消息不被破解,需要额外的加密方法。
  1. 数字签名(digital signatures)
    a message is signed with the sender's private key and can be verified by anyone who has access to the sender's public key. This verification proves that the sender had access to the private key, and therefore is likely to be the person associated with the public key.
    • 解决的主要问题是验证消息是否被改动。
    • 间接解决了public key encryption不能保证public key和消息是原配的问题
    • 数字签名可以保证消息没有被改动过,任何改动均会造成签名失效。S发送的消息经过private key数字签名后,用public key可以验证签名的有效性,如果签名有效,即保证消息是由private key的所有者发出的。
    • 数字签名的根本是将消息和key关联起来。

RSA算法

Key Generation

  1. RSA的基础: 如果两个正整数a和n互质,则n的欧拉函数 φ(n) 可以让下面的等式成立:

    欧拉函数 φ(n)定义: 任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?计算这个结果的函数就叫欧拉函数.

  2. RSA算法的关键:φ(n)的值,如果φ(n)计算出来了,就破解了。

  3. n的选择

  • 为什么n的取值为两个质数的乘积,而不是直接随机选取一个大整数?
    因为作为私钥的d是通过求取n的欧拉函数得到的,所以有以下几点不能直接选取n,而采取n=p*q的方式得到。

    直接获取n,如果n是质数,那么n的欧拉函数就等于 φ(n)=n-1,那么私钥d直接就被破解了,所以n绝对不能是一个质数。如果直接选取一个极大的正整数作为n,那就要保证n不能是质数。

    但是直接选取n还有一个更大的问题,私钥的d无法通过计算得到。因为对于破解者因数分解是极其困难的,同样对于生成秘钥的人也是极其困难的。

    所以就需要一种方式,让破解者计算n的欧拉函数(即对n进行因式分解)极其困难,而秘钥生成者极容易计算。

    综上所述,产生了目前n的计算方式 n=p*q;p和q是两个极大的质数。因为φ(n)=(p-1)(q-1),所以秘钥生成者很容易计算出n的欧拉函数。而破解者因为不知道p和q的数值,所以必须暴力进行因数分解,从而使得破解极其困难。

  1. e和(n)为什么要互质?
    根据欧拉定理,a和n必须互质,在RSA中,a=e,n=φ(n),所以这两个数值必须是互质的。

  2. e为什么要小于(n)?
    未知。

  3. 为什么选取φ(n)作为欧拉定理中的n?
    如果RSA中,不使用e和φ(n)作为互质的两个元素,而使用e和n作为互质的两个元素。那么在公布公钥(e,n)之后,d极容易被破解。

    因为欧拉定理

    可以表示为

    通过上面的等式可以发现,d有两种计算方式:

    第一种:
    通过如下公式:

    计算d,因为φ(n)极难计算,所以d不会被破解.

    第二种:
    可以通过扩展欧几里得算法求二元一次方程e·d-1=kn,e和n已知。这种方式因为e和n均为已知量,所以很容易求得d。

    综上所述,如果直接用n作为欧拉定理中的n,那么因为公钥提供了e和n的值,私钥的极容易通过上面的第二种方法计算得到,从而被破解。所以不能直接使用n作为互质数值中的一个,而应该采用φ(n)和e配对。采用φ(n)的情况下,第二种方式就无法计算出d的值,从而保证d在任何情况下都极不容易被破解。

Encryption and Decryption

  1. 加密的公式
  2. 解密的公式
  3. 加密和解密的公式为什么是上面两个?
    因为根据欧拉定理得到的三个数值n,d,e,可以使上面两个公式同时成立,并能够保证d的不可破解性。
  4. 为什么私钥选择(d,n),而公钥选择(e,n) ?
    因为上面的两个公式中的n,d,e,必须是由key generation中的方式得到时,两个公司才成立。所以根据公式,n,d,e被分为了两组(e,n)和(d,n)。那为什么选择(e,n)为公钥呢?显而易见,d是破解这种加密方式的关键,所以d一定是需要保存在安全位置的数值,那(d,n)就不可能作为公钥,而只能作为私钥。
  5. 加密和解密公式的证明,请搜索阮一峰的博客,里面有具体的证明过程。

最后来个项目自荐

  • 一个为Android系统源码,JDK源码,OkHttp源码等,进行注释的项目,主要是对源码的一种学习:github.com/kishimotoin… ,做过注释的类在commit里可以看到。觉得好可以给颗星,多谢啦!