2. 后量子密码算法族与实现特征

后量子密码(PQC)并不是一种单一算法,而是若干数学结构差异极大的算法族。NIST 标准化进程最终选定的格基密钥封装 ML-KEM(FIPS 203)、格基签名 ML-DSA(FIPS 204)、哈希签名 SLH-DSA(FIPS 205),以及仍在评估中的编码密码、多变量密码、MPC-in-the-Head 等,其数学结构决定了实现层面的运算类型、数据宽度、访存模式与随机数需求。侧信道防护不能脱离这些结构空谈,必须从“算法在硬件上实际做了什么运算”出发。

一、格基算法:模运算与采样是侧信道的主战场

ML-KEM 与 ML-DSA 都建立在模格上的 LWE/SIS 问题之上,核心运算可归纳为三类:多项式环 R_q = Z_q[X]/(X^n+1) 上的 NTT 乘法、误差/掩码采样、以及压缩与舍入。以 ML-KEM-768 为例,参数为 n=256、q=3329、k=3,私钥是一个 k×k 的多项式矩阵,解密时需计算 m = Decode(Compress(v - s^T u))。

这些运算对侧信道极其敏感。第一,NTT 中的模乘若使用条件减法或分支实现,会因操作数不同产生时序差异;第二,CBD 采样(中心二项分布)依赖对随机比特的逐位累加,若随机数生成器被故障注入或功耗分析定位,可能恢复种子;第三,压缩函数 Compress 与 Decompress 中的舍入边界,在电磁分析下会泄露系数的高位信息。因此格基实现通常要求:常数时间 NTT、掩码化采样、以及对 q 取模的固定周期实现。

二、编码密码:大矩阵运算与解码复杂度

编码密码(如 Classic McEliece、BIKE、HQC)基于纠错码的译码难题。Classic McEliece 使用二进制 Goppa 码,公钥是一个巨大的 k×n 生成矩阵,私钥包含可快速译码的结构。其实现特征是:密钥生成与加密涉及大规模位矩阵乘法,解密则执行 Patterson 译码或类似算法。

侧信道风险集中在译码器的分支结构上。译码过程通常包含“寻找错误位置多项式”的迭代步骤,迭代次数与错误图样相关,若实现中迭代次数或内存访问地址随秘密变化,就会形成时序或缓存侧信道。此外,McEliece 公钥体积达数百 KB 至 MB 级,密钥加载与缓存行为本身也可能泄露访问模式。防护上常采用常数时间译码、固定迭代上限、以及密钥分块掩码。

三、多变量密码:有限域上的二次映射

多变量密码(如 Rainbow 的变体、UOV)基于求解有限域上二次方程组的困难性。公钥是一组二次多项式,私钥由两个可逆仿射变换与一个中心映射复合而成。签名时先求中心映射的逆,再施加仿射变换。

其实现特征是大量小域(如 GF(256))上的乘加运算,数据宽度小、并行度高。侧信道风险主要来自中心映射求逆时的线性代数消元过程:高斯消元中的主元选择、行交换与条件判断,若依赖秘密值,会通过时序或功耗泄露私钥结构。防护手段包括:固定消元顺序、掩码化有限域乘法、以及避免数据相关的内存索引。

四、哈希签名:结构简单但依赖底层哈希

SLH-DSA(SPHINCS+)是典型的哈希签名,安全性完全归约到哈希函数的抗碰撞与抗原像性。其结构为:WOTS+ 一次性签名、Merkle 树认证路径、以及超树分层。签名过程需要遍历大量哈希调用,私钥是伪随机生成的种子。

哈希签名的侧信道面相对“干净”,因为运算主要是哈希压缩函数,天然常数时间。但风险转移到了随机数生成与种子管理:若 SPHINCS+ 的伪随机函数 PRF 使用的密钥被泄露,攻击者可伪造任意签名。此外,签名时遍历的树节点索引若与秘密相关,也可能通过功耗区分。防护重点是:种子安全存储、PRF 常数时间实现、以及避免签名路径的缓存泄露。

后量子密码算法族:数学结构 → 实现特征 → 侧信道风险 格基(ML-KEM/ML-DSA) 数学结构 模格 LWE/SIS R_q = Z_q[X]/(X^n+1) 核心运算 NTT 模乘 · CBD 采样 Compress / Decompress q=3329, n=256, k=3 侧信道风险 条件减法时序差异 采样随机数功耗泄露 舍入边界电磁分析 NTT 访存模式 防护要点 常数时间 NTT 掩码化采样 + 固定周期取模 典型参数 ML-KEM-768: 1184B 公钥 ML-DSA-65: 1952B 签名 编码密码(McEliece/BIKE) 数学结构 纠错码译码难题 Goppa 码 / QC-MDPC 核心运算 k×n 位矩阵乘法 Patterson / 迭代译码 密钥体积 数百KB~MB 侧信道风险 译码迭代次数时序 错误位置多项式分支 密钥加载缓存访问模式 矩阵乘法功耗特征 防护要点 常数时间译码 固定迭代上限 + 密钥分块掩码 典型参数 McEliece: 公钥约 1MB BIKE: 公钥约 1.5KB 多变量(UOV/Rainbow) 数学结构 有限域二次方程组 仿射变换 ∘ 中心映射 核心运算 GF(256) 乘加运算 中心映射求逆 线性代数消元 侧信道风险 高斯消元主元选择 行交换条件分支 有限域乘法功耗 数据相关内存索引 防护要点 固定消元顺序 掩码化 GF 乘法 + 无索引泄露 典型参数 UOV: 公钥约 278KB 签名约 128B 哈希签名(SLH-DSA) 数学结构 哈希函数抗碰撞性 WOTS+ / Merkle 树 核心运算 大量哈希压缩调用 超树分层遍历 PRF 伪随机生成 侧信道风险 PRF 密钥泄露 种子存储安全 树节点索引功耗区分 签名路径缓存泄露 防护要点 种子安全存储 PRF 常数时间 + 路径隐藏 典型参数 SLH-DSA-128s: 签名 7856B 公钥 32B

五、算法族差异对防护策略的直接影响

从上述分析可以看出,不同算法族的侧信道防护重点截然不同。格基算法的核心是模运算与采样,防护需围绕常数时间 NTT 与掩码采样展开;编码密码的核心是译码分支与大规模矩阵,防护需关注迭代次数与缓存模式;多变量密码的核心是有限域消元,防护需固定消元顺序并掩码乘法;哈希签名的核心是哈希与种子,防护需保障 PRF 常数时间与种子安全。

在实际工程中,一个常见的误区是“套用 AES 的掩码方案”。AES 的掩码基于布尔与算术掩码在 GF(2^8) 上的转换,而格基算法工作在 Z_q 上,q=3329 不是 2 的幂,掩码转换需要额外的模运算,开销显著。因此,格基实现更倾向于使用算术掩码(加法掩码)而非布尔掩码,并在 NTT 的每一层蝶形运算中保持掩码一致性。

实现提示:在评估一个 PQC 实现的侧信道安全性时,先确认其算法族,再检查对应的高风险运算是否已常数时间化。例如,ML-KEM 实现应重点审查 poly_tomsg 与 poly_frommsg 中的条件分支;SLH-DSA 实现应重点审查 PRF 的密钥加载路径。

六、参数选择与安全等级的对应关系

NIST 将 PQC 安全等级分为 1、3、5 三档,分别对应 AES-128、AES-192、AES-256 的经典安全强度。ML-KEM-512/768/1024 对应等级 1/3/5,ML-DSA-44/65/87 对应等级 2/3/5,SLH-DSA 则通过哈希输出长度与树高度组合实现不同等级。参数选择直接影响实现开销:等级越高,k 越大,NTT 层数不变但矩阵维度增加,密钥与密文体积线性增长。

侧信道防护的开销也随参数增长。以掩码为例,一阶掩码通常使面积增加约 2~3 倍,二阶掩码增加 4~6 倍。对于资源受限的嵌入式设备,ML-KEM-512 配合一阶掩码可能是更现实的选择;而对于服务器端,ML-KEM-1024 配合高阶掩码可提供更强的防护。工程上需要在安全等级、防护阶数、面积与延迟之间做权衡。

七、从数学结构到实现安全:一个检查框架

综合以上分析,可以形成一个面向 PQC 实现的侧信道检查框架:第一步,识别算法族与核心运算;第二步,定位秘密相关分支与内存访问;第三步,评估随机数生成与种子管理;第四步,选择匹配的掩码方案与常数时间技术;第五步,通过 TVLA(Test Vector Leakage Assessment)或具体攻击验证防护效果。这个框架不依赖具体算法,但每一步的检查项因算法族而异。

例如,对 ML-KEM 的 TVLA 测试应重点覆盖 NTT 与采样模块;对 SLH-DSA 则应重点覆盖 PRF 与树遍历。只有将数学结构、实现特征与侧信道风险三者对齐,才能设计出真正有效的防护方案,而不是盲目堆砌防护措施。