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 的算法流程如下:
-
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 两端的密钥全部生成完成。
最后希望下面的表能帮助理解密钥生成所具备的前提条件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。