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

学习Https原理的过程当中,对公钥证书和私钥证书交换的过程、公钥算法、公钥证书、RSA算法进行了的学习。下面主要是对公钥加密和RSA算法的分析。分析过程并无覆盖https的方方面面,只是本身的一个笔记,但愿在公私钥加密中使用的RSA算法方面,能对你们有所帮助。git

Public Key Encryption(公钥加密)

公钥加密有两种用途:

Public key encryptography accomplishes two functions:github

  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没法经过计算获得。由于对于破解者因数分解是极其困难的,一样对于生成秘钥的人也是极其困难的。code

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

    综上所述,产生了目前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里能够看到。以为好能够给颗星,多谢啦!
相关文章
相关标签/搜索