4、SAE(Simultaneous Authentication of Equals)深入:数学原理(椭圆曲线群、FFC群)、Hunting and Pecking、Commit/Confirm状态机、抗侧信道实现

WPA3 个人版的核心安全基石是 SAE(Simultaneous Authentication of Equals)协议,它取代了 WPA2 中脆弱的 PSK 四次握手。SAE 并非简单的口令验证,而是一种基于 Dragonfly 密钥交换的密码认证密钥协商协议。它通过数学上的离散对数难题和一种称为“Hunting and Pecking”的机制,将人类可记忆的密码(低熵)安全地映射到密码学群元素(高熵),并抵御离线字典攻击。本章将深入剖析 SAE 的数学基础、状态机流转以及工程实现中的抗侧信道要点,帮助开发者从原理到落地全面掌握 WPA3 的安全内核。

SAE 协议核心机制与状态流转图 密码映射 (Hunting & Pecking) 1. 密码 + MAC 地址 → 种子 2. SHA-256 迭代生成候选点 3. 校验是否落在椭圆曲线上 4. 若失败:计数器+1 重试 5. 若成功:得到群元素 PE PE = 椭圆曲线上的点 Commit/Confirm 状态机 IDLE COMMIT CONFIRM ACCEPTED 发送Commit 收到Commit 发送Confirm 验证通过 抗侧信道实现 • 常数时间比较 (memcmp_s) • 标量乘法使用 Montgomery 阶梯 • 幂运算使用固定窗口 • 随机数使用 CTR_DRBG • 掩码操作隐藏中间值 防止时序/功耗攻击 PMK = H(s · PE) → 4次握手 → PTK → GTK s 为双方标量之和,PE 为共享密码元素 PE 标量/元素 FFC 群使用模素数 p 的乘法群,椭圆曲线群使用 Weierstrass 曲线 y² = x³ + ax + b Hunting and Pecking 平均需要约 256 次尝试才能找到一个曲线上的点 密码映射 状态机 抗侧信道 密钥派生

4.1 数学基础:椭圆曲线群与 FFC 群

SAE 协议的核心数学运算发生在有限循环群中。根据 RFC 7664(Dragonfly),SAE 支持两种群类型:有限域循环群(FFC,即模素数 p 的乘法群)和椭圆曲线群(ECC)。选择哪种群由 AP 在 Beacon 帧中通告的 AKM 套件决定。FFC 群使用形如 g^x mod p 的模幂运算,而 ECC 群使用椭圆曲线上的标量乘法 k·G。两者的安全性都依赖于离散对数难题(DLP)的计算不可行性。

核心原理对比:

维度FFC 群(MODP)ECC 群(椭圆曲线)
群元素整数模 p 的乘法群曲线 y² = x³ + ax + b 上的点
运算模幂运算 g^x mod p标量乘法 k·G(点加和倍点)
参数大小p 为 2048/3072/4096 位曲线阶 n 为 256/384 位
安全强度112~256 位128~256 位
计算效率较慢(大整数模幂)较快(域运算更紧凑)
典型曲线RFC 3526 定义的 14/15/16 组NIST P-256、P-384、Brainpool

在实现中,FFC 群需要预计算生成元 g 和模数 p,而 ECC 群需要预定义曲线参数(a、b、基点 G、阶 n)。SAE 协议规定,双方必须使用相同的群参数,否则无法完成密钥协商。对于嵌入式设备,通常优先选择 P-256 曲线,因为其计算量较小且安全性足够。

4.2 Hunting and Pecking:从密码到群元素的确定性映射

SAE 面临的核心挑战是如何将人类可记忆的密码(通常只有几十比特熵)安全地映射到密码学群元素。直接使用密码作为私钥或公钥会导致字典攻击。Hunting and Pecking 机制通过以下步骤解决此问题:

  1. 种子生成:将密码与双方 MAC 地址拼接,使用 SHA-256 生成一个 256 位种子值。
  2. 候选点计算:将种子作为 x 坐标(或 FFC 中的候选值),计算对应的 y 值(或检查是否为二次剩余)。
  3. 有效性检查:对于 ECC,检查点 (x, y) 是否满足曲线方程;对于 FFC,检查值是否在 [1, p-2] 范围内且为二次剩余。
  4. 迭代重试:如果检查失败,将种子加 1(计数器递增)后重新计算,直到找到有效点。

平均而言,约 50% 的 x 坐标对应曲线上的点,因此期望尝试次数为 2 次。但为了确保双方独立计算得到相同结果,协议规定最多尝试 256 次。若超过 256 次仍未找到,则终止协商。这种设计保证了映射的确定性和一致性,同时避免了密码直接暴露在群运算中。

实现要点:Hunting and Pecking 过程必须使用常数时间算法,即无论找到点的快慢,每次迭代的耗时都应保持一致。否则攻击者可通过测量响应时间推断密码的某些位。实践中,通常固定执行 256 次迭代,即使提前找到也继续执行空操作。

4.3 Commit/Confirm 状态机:协议流程与状态转换

SAE 的握手过程由两个阶段组成:Commit 阶段和 Confirm 阶段。状态机定义了四个主要状态:IDLE、COMMIT、CONFIRM、ACCEPTED。双方必须严格按照状态转换规则交换消息,任何异常都可能导致握手失败。

状态触发事件动作输出
IDLE收到 SAE 请求生成随机标量 s_own 和掩码 m_own计算承诺值 commit = scalar_op(s_own, m_own, PE)
COMMIT发送 Commit 消息等待对端 Commit收到对端 commit 后计算共享元素 ss = scalar_op(s_own, peer_commit)
CONFIRM发送 Confirm 消息计算确认值 confirm = H(kek | commit_own | commit_peer | mac_own | mac_peer)验证对端 confirm 是否匹配
ACCEPTED验证通过派生 PMK = H(ss | commit_own | commit_peer)进入 4 次握手阶段

状态机的关键安全属性是:双方必须交换 Commit 后才能计算共享密钥,且 Confirm 消息用于验证对方确实知道相同的密码元素 PE。如果 Confirm 验证失败,状态机回到 IDLE 并增加失败计数器,防止暴力破解。

4.4 抗侧信道实现:常数时间与掩码技术

SAE 的实现在嵌入式设备上尤其容易受到侧信道攻击(如时序分析、功耗分析)。攻击者通过测量设备执行密码运算时的物理特征,可能推断出私密标量或密码相关信息。以下是必须落实的抗侧信道措施:

  • 常数时间比较:所有对 Commit/Confirm 值的比较必须使用常数时间函数(如 memcmp_s),避免因字节不匹配提前返回。
  • 标量乘法掩码:在 ECC 标量乘法中,使用 Montgomery 阶梯算法,确保每次迭代执行相同的操作序列,不依赖标量的位值。
  • 模幂固定窗口:对于 FFC 群,使用固定窗口的模幂算法,将指数分成固定大小的窗口,每个窗口执行相同次数的乘法。
  • 随机数生成:使用符合 CTR_DRBG 标准的随机数生成器,确保每次握手的标量 s 和掩码 m 不可预测。
  • 中间值掩码:在计算过程中,对敏感中间值乘以随机掩码,并在最终结果中去除掩码,防止功耗分析。

常见误区:许多开发者认为只要使用标准加密库就自动具备抗侧信道能力。实际上,库的默认配置可能未启用常数时间选项。例如 OpenSSL 需要显式设置 EC_FLAG_CONSTANT_TIME 标志。此外,Hunting and Pecking 的循环次数必须固定,不能因找到点而提前退出。

4.5 实战案例:嵌入式 Wi-Fi 模块的 SAE 握手优化

某 IoT 设备使用 ESP32-C3 实现 WPA3 个人版,初始固件在 SAE 握手阶段耗时约 850ms,且存在明显的时序波动。通过日志分析发现,Hunting and Pecking 的平均迭代次数为 3.2 次,但最坏情况达到 47 次,导致握手时间不稳定。进一步检查代码,发现开发者使用了 while(1) 循环,找到点后立即跳出,未执行固定迭代。

优化措施:

  1. 将 Hunting and Pecking 改为固定 256 次迭代,每次迭代执行相同的 SHA-256 和点校验操作。
  2. 使用硬件加速器(如 ESP32-C3 的 RSA/ECC 加速器)执行标量乘法,并启用常数时间模式。
  3. 将随机数生成切换到硬件 TRNG,避免软件伪随机数带来的可预测性。
  4. 在 Confirm 比较中使用 CRYPTO_memcmp 替代 memcmp。

结果对比:优化后,握手时间稳定在 620ms ± 5ms,波动范围从原来的 ±180ms 缩小到 ±5ms。功耗分析显示,功耗轨迹的方差降低了 90%,有效抵御了简单功耗分析(SPA)攻击。该优化使设备通过了 Wi-Fi Alliance 的 WPA3 认证测试中的时序一致性要求。

复盘经验:抗侧信道不是单一函数的问题,而是整个协议栈的系统性工程。从密码映射、状态机到密钥派生,每个环节都需要考虑常数时间特性。建议在开发阶段就使用侧信道分析工具(如 ChipWhisperer)进行验证,而不是等到认证阶段才发现问题。

SAE 协议的设计体现了密码学工程中“安全与可用性平衡”的哲学。Hunting and Pecking 将低熵密码安全提升到高熵群元素,Commit/Confirm 状态机确保了双向认证和抗重放攻击,而抗侧信道实现则堵住了物理攻击的入口。对于开发者而言,理解这些底层机制不仅有助于正确实现 WPA3,更能为未来设计其他认证协议提供方法论参考。