Hotdry.
security

ML-KEM (Kyber) 集成 BoringSSL:量子安全 HTTPS 与 AVX2 优化

在 BoringSSL 和 OpenSSL 中集成 ML-KEM 实现量子安全的 TLS 1.3 密钥交换,支持 hybrid PQ+classical 模式,并通过 AVX2 优化多项式乘法保持亚毫秒开销。

量子计算的快速发展对当前基于经典密码学的 HTTPS 构成严重威胁,尤其是 “Harvest Now, Decrypt Later” 攻击:攻击者可捕获今日流量,待量子计算机成熟后解密。NIST 已标准化 ML-KEM(原 Kyber)作为后量子密钥封装机制(KEM),其基于格密码学的 NTRU-like 结构提供量子抵抗性。在 TLS 1.3 中集成 ML-KEM 可实现量子安全的密钥交换,本文聚焦 BoringSSL 和 OpenSSL 的工程化集成路径、hybrid PQ+classical 模式设计,以及 AVX2 优化的多项式乘法实现,确保握手开销控制在亚毫秒级。

ML-KEM 在 TLS 1.3 中的角色与 Hybrid 模式设计

传统 TLS 1.3 使用 (EC) DHE 进行前向保密密钥交换,而 ML-KEM 作为 KEM 可直接生成共享秘密,替换或增强 DHE。最佳实践是 hybrid 模式:结合经典 ECDH(如 X25519)和 PQ KEM(如 ML-KEM-768),确保即使一方被破也会安全。这种设计遵循 IETF draft-ietf-tls-hybrid-design,通过在 key_share 扩展中串联公钥 / 密文,并将共享秘密简单连接(ss = ss_classical || ss_pq)输入 HKDF 密钥派生。

ML-KEM 有三种参数集,适用于不同安全级别:

参数集 NIST 级别 公钥大小 密文大小 共享秘密大小 推荐 hybrid 组合
ML-KEM-512 Level 1 800 B 768 B 32 B X25519 + ML-KEM-512
ML-KEM-768 Level 3 1184 B 1088 B 32 B X25519 + ML-KEM-768
ML-KEM-1024 Level 5 1568 B 1568 B 32 B P-256 + ML-KEM-1024

在 ClientHello 中,客户端发送串联的 X25519 公钥 + ML-KEM 公钥(总大小约 1.3 KB for 768);服务器响应 X25519 公钥 + ML-KEM 密文。双方独立计算各自共享秘密后连接,确保固定长度避免侧信道。相比纯经典,握手大小增加约 2 KB,但现代 MTU(1500 B)可容纳,通常无需分片。

BoringSSL 与 OpenSSL 集成路径

BoringSSL(Google 首选):作为 Chromium 和 Google 服务核心,直接扩展 key share groups。定义新组 ID 如 SSL_GROUP_X25519_MLKEM768,实现 generate_key_share 和 process_key_share 函数:

  • 生成 X25519 密钥对 + ML-KEM 密钥对。
  • 序列化:X25519_pk (32B) || ML-KEM_pk (1184B)。
  • 解包后,运行 ECDH + ML-KEM decaps,连接秘密输入 TLS 密钥调度。 Google 已 upstream ML-KEM 支持,OQS-BoringSSL fork 提供现成 hybrid 组。落地参数:启用组列表优先 hybrid,fallback 到 X25519。

OpenSSL:3.5+ 原生内置 ML-KEM,支持 provider 模型。

  • Provider 方式(推荐实验):加载 oqs-provider,配置 openssl.cnf 添加 ML-KEM 算法和 hybrid 组。
  • Native 方式:编译 OpenSSL 3.5,启用 -DOPENSSL_PQ,配置 Groups=0x1E00:0x1E01(自定义 hybrid ID)。 示例配置:
[openssl_init]
providers = provider_sect, oqsprovider

[provider_sect]
oqsprovider = oqsprovider.so

[TLS 1.3]
Groups = X25519:mlkem768_hybrid_x25519

测试:openssl s_server -groups mlkem768_hybrid_x25519 -wwwopenssl s_client 验证握手。

AVX2 优化:多项式乘法与 NTT 加速

ML-KEM 核心是 R_q = Z_q [X]/(X^256 +1) 中的多项式乘法,使用 NTT(数论变换)实现。标量实现周期高,AVX2(256-bit SIMD)可并行处理 16 个 16-bit 系数,实现亚毫秒 KEM 操作。

关键优化点:

  1. NTT 蝶形运算:AVX2 _mm256_madd_epi16 等指令批量乘加,单层 NTT 周期减 8x。
  2. 点乘与模约简:向量化 Montgomery 乘法,Barrett 减法。
  3. 完整 KEM:keygen ~10k cycles, encap/decap ~20k cycles(Haswell),比标量快 90%。

基准(Intel Skylake/AVX2):

  • ML-KEM-768 encap: 25 μs(vs 200 μs 标量)。
  • TLS 握手总延迟增加 <0.5 ms,CPU 开销 <1%。

实现清单(liboqs 或自定义):

  • 检测 CPU:__builtin_cpu_supports ("avx2")。
  • NTT 代码:预计算 twiddle factors,层级蝶形循环向量化。
  • Fallback:非 AVX2 CPU 用标量路径。 风险:代码大小增 20%,分支预测 miss;限制造成握手大小暴增(监控阈值:ClientHello <4 KB)。

落地部署与监控参数

部署清单

  1. 选择 ML-KEM-768 hybrid(平衡安全 / 性能)。
  2. 服务器优先 hybrid 组,客户端支持列表前置。
  3. 测试互操作:Cloudflare/ AWS PQ-TLS lab,wireshark 捕获验证 concat。
  4. 性能基准:iperf3 TLS,延迟 <10 ms,吞吐>90% 经典。
  5. 回滚策略:若 PQ 失败率 >0.1%,降级 classical;A/B 测试 1% 流量。

监控要点

  • 握手失败率:PQ 协商成功率 >95%。
  • 延迟直方图:P99 <5 ms。
  • 带宽:平均握手大小 <2.5 KB。
  • 日志:SSLKEYLOGFILE 捕获,审计 PQ 使用。

风险与缓解

  1. 中间设备丢包大扩展:启用 TLS 1.3 padding,MTU 发现。
  2. 低端设备性能:仅服务器端 PQ,客户端 classical。
  3. 标准演进:跟踪 RFC,OpenSSL 4.0 更新。

通过上述集成,量子安全 HTTPS 可无缝部署,开销微乎其微。未来,随着浏览器支持(如 Chrome flags),hybrid 将成默认。

资料来源

(正文字数:约 1250 字)

查看归档