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

無尾熊二發表於2017-12-21

學習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) 可以讓下面的等式成立:

    Https中公私鑰加密演算法和其使用的RSA演算法分析
    尤拉函式 φ(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極容易被破解。

    因為尤拉定理

    Https中公私鑰加密演算法和其使用的RSA演算法分析
    可以表示為
    Https中公私鑰加密演算法和其使用的RSA演算法分析

    通過上面的等式可以發現,d有兩種計算方式:

    第一種:
    通過如下公式:

    Https中公私鑰加密演算法和其使用的RSA演算法分析
    計算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. 加密的公式
    Https中公私鑰加密演算法和其使用的RSA演算法分析
  2. 解密的公式
    Https中公私鑰加密演算法和其使用的RSA演算法分析
  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裡可以看到。覺得好可以給顆星,多謝啦!

相關文章