天天看点

详解 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 加密握手中共享密钥的生成过程

继续阅读