天天看點

詳解 QUIC 加密握手中共享密鑰的生成過程

1、基本概要

  • QUIC 傳輸的資料幾乎都是要加密的,關于加密算法這裡不做介紹,加密必然需要用到密鑰;
  • QUIC 中的加密密鑰有兩個 initial key 和 forword-secure key。前者用于實作 0-RTT 的握手,後者則用于握手成功以後整個會話的資料加密;
  • QUIC 的密鑰使用 Diffe-Hellman 算法生成;

2、解析

  • Diffe-Hellman 算法的密鑰生成過程

    我們知道 Diffe-Hellman 算法用于生成網絡通信兩端(假設為 Alice 和 Bob)的加密密鑰 K。

    使用該算法的前提:

    • Alice 和 Bob 都知道兩個素數(g、p)的存在
    • Alice 有 a(private key);Bob 有 b(private key)
    有了上面的前提,Diffe-Hellman 的算法流程如下:
    • 1、Alice 計算 A=g^a mod p,并發送 A 給 Bob;
    • 2、Bob 計算 B=g^b mod p,并發送 B 給 Alice;
    • 3、此時,Alice 計算 B^a mod p,Bob 計算 A^b mod p,
    • 4、分解可得,

      B^a mod p = (g^b mod p)^a mod p = g^ab mod p = K;

      A^b mod p= (g^a mod p)^b mod p = g^ab mod p = K;

      于是,雙方都有了一個共享密鑰 K,關于 Diffe-Hellman 的數學原理,可參考這篇英文文章。

  • QUIC 加密握手的過程
    詳解 QUIC 加密握手中共享密鑰的生成過程

注:閱讀下文過程中請注意梳理 ephemeral 和 long-term、public 和 private。

了解了 Diffe-Hellman 算法生成共享密鑰的原理,我們來看看 QUIC 的兩個密鑰是怎樣生成的。

這裡的通信兩端分别是 QUIC client(Alice) 和 QUIC server(Bob),具備的前提是:

  • QUIC client 和 QUIC server 已知密鑰交換算法(即已知 g、p);
  • QUIC client 有 ephemeral Diffe-Hellman private value; QUIC server 有 long-term Diffe-Hellman private value、ephemeral Diffe-Hellman private value,為了友善描述我這裡分别簡寫為:C-DH-E-pri,S-DH-L-pri,S-DH-E-pri。

再來看看密鑰的生成過程:

  • server 收到 Inchoate CHLO 後,給 client 響應一個 REJ 消息,這個 REJ 中包含了 server 的 long-term Diffe-Hellman public value(即 B);
  • client 收到 REJ,處理完後發送 complete CHLO(complete CHLO 并未加密),注意此時才會生成 initial key(即 K= B^a mod p)。
  • complete CHLO 中包含了 client 的 ephemeral Diffie-Hellman public value(即 A),server 收到 complete CHLO 後,便可以計算出 initial key(即 K= A^b mod p)。server 此時會用 initial key 加密 SHLO,SHLO 包含了 server 的 ephemeral Diffe-Hellman public value。此時 server 便可以利用 client 的 A 和自己的 S-DH-E-pri 來生成 forward-secure key。
  • client 收到 SHLO 時,用 initial key 解密資料,取出 server 的 ephemeral Diffe-Hellman public value 和自己的 C-DH-E-pri 生成 forward-secure key。

至此,client 和 server 兩端的密鑰全部生成完成。

最後希望下面的表能幫助了解密鑰生成所具備的前提條件。

詳解 QUIC 加密握手中共享密鑰的生成過程

繼續閱讀