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裏能夠看到。以爲好能夠給顆星,多謝啦!
相關文章
相關標籤/搜索