1. 后量子密码实现安全与侧信道防护导论

后量子密码(Post-Quantum Cryptography, PQC)并不是“把 RSA 换成另一种算法”这么简单。它要解决的是:当攻击者拥有大规模容错量子计算机时,Shor 算法可以在多项式时间内求解大整数分解与离散对数,从而瓦解 RSA、ECC、DH 等当前主流公钥体制。NIST 自 2016 年启动 PQC 标准化,2024 年正式发布首批标准:用于密钥封装的 ML-KEM(FIPS 203,源自 CRYSTALS-Kyber)、用于数字签名的 ML-DSA(FIPS 204,源自 CRYSTALS-Dilithium)与 SLH-DSA(FIPS 205,源自 SPHINCS+)。这些算法基于格、编码、多变量、哈希等数学难题,其安全性不再依赖大数分解。

但“数学上安全”与“实现上安全”之间存在巨大鸿沟。PQC 算法普遍具有更大的密钥、密文和签名尺寸,运算涉及大量多项式乘法、NTT(数论变换)、采样与拒绝循环,代码路径复杂、分支与内存访问模式高度依赖秘密数据。这使它们对侧信道攻击(Side-Channel Attack, SCA)和故障注入攻击(Fault Injection Attack, FIA)尤为敏感。本课程的目标,就是让学习者理解 PQC 实现安全的威胁模型,掌握从算法层到指令层的防护设计方法,并能对真实实现进行侧信道评估与加固。

为什么 PQC 迁移必须同步考虑实现安全

传统公钥算法在实现层面已有成熟防护经验,例如 RSA 的盲化、ECC 的标量随机化与统一坐标公式。PQC 迁移若只关注“换算法”,会带来新的风险面:

  • 密钥与中间值更大:ML-KEM 的私钥包含多项式向量,ML-DSA 的私钥含矩阵与向量,秘密数据在内存中驻留时间更长,缓存与内存侧信道窗口更大。
  • 数据相关分支与访存:拒绝采样、条件比较、压缩舍入等步骤若按秘密值分支或索引,会泄露信息。
  • NTT 与多项式乘法:蝶形运算的访存模式、模约减实现若非常量时间,可能被计时或缓存攻击利用。
  • 故障注入:对 NTT、采样或签名压缩阶段注入故障,可能诱导出可恢复私钥的错误签名。
  • 混合部署:迁移期常采用“经典+PQC”混合密钥交换,协议层与实现层的交互会引入新的降级与状态机风险。

因此,PQC 实现安全不是可选项,而是迁移工程的一部分。它要求开发者在设计阶段就确定威胁模型、选择常量时间原语、规划随机数来源与密钥生命周期,并在测试阶段用侧信道评估验证防护有效性。

实现安全与侧信道防护的范畴

本课程所讨论的“实现安全”覆盖以下层面:

  1. 算法层:选择具有明确安全归约的参数集,避免使用被降级或非标准参数;理解 NIST 标准中的可选性与实现约束。
  2. 编码层:密钥编码、压缩与解压缩、序列化格式的正确性与常量时间性,防止因格式解析泄露秘密。
  3. 微架构层:常量时间编程、避免秘密相关分支与访存、缓存与推测执行防护、掩码(Masking)与隐藏(Hiding)技术。
  4. 系统层:随机数生成器(TRNG/DRBG)质量、密钥存储与隔离、TEE/HSM 的使用、故障检测与响应。
  5. 评估层:TVLA(Test Vector Leakage Assessment)、CPA/DPA、模板攻击、故障注入实验与统计判定。

侧信道防护的核心思想是“让可观测的物理量(时间、功耗、电磁、缓存)与秘密值统计独立”。常用手段包括:常量时间实现、随机化(盲化、掩码、洗牌)、冗余计算与一致性校验。故障防护则强调检测与响应:对关键中间值做冗余校验,发现异常即拒绝输出并清零敏感状态。

PQC 实现安全与侧信道防护 · 学习路线 威胁背景 • Shor 算法瓦解 RSA/ECC • NIST PQC 标准落地 • 密钥/密文尺寸增大 • 数据相关分支与访存 • 故障注入可恢复私钥 • 混合部署引入新风险 防护层次 算法层:参数选择 · 安全归约 编码层:常量时间序列化 · 压缩 微架构层:掩码 · 隐藏 · 常量时间 系统层:TRNG · 密钥隔离 · 故障响应 评估与验证 • TVLA 泄漏评估 • CPA / DPA 攻击 • 模板攻击 • 故障注入实验 • 统计判定与加固迭代 • 侧信道安全等级评估 课程学习路线(30 章) 基础 PQC 数学 与标准 实现 常量时间 NTT/采样 防护 掩码/隐藏 故障检测 评估 TVLA/CPA 故障注入 迁移 混合部署 工程落地 从数学基础到实现加固,再到侧信道评估与迁移落地,形成完整闭环

从“知道”到“做到”:本课程的学习方法

本课程不满足于概念介绍,而是围绕真实实现展开。每一章都会尽量给出可操作的对象、参数与判断依据。例如,在讨论 ML-KEM 的 NTT 实现时,我们会给出模数 q=3329、NTT 长度 n=256、蝶形运算的常量时间写法,以及如何用 TVLA 判断是否存在一阶泄漏;在讨论掩码时,会给出布尔掩码与算术掩码的转换条件、刷新(refresh)时机与随机数消耗量估算。

学习过程中建议遵循“三步法”:

  1. 建立威胁模型:明确攻击者能观测什么(时间、功耗、电磁、缓存、故障注入能力),以及保护的目标秘密是什么(私钥、种子、中间多项式)。
  2. 定位泄漏点:在算法流程中标记所有与秘密相关的分支、访存、循环次数和中间值,判断哪些是常量时间可消除的,哪些需要掩码或隐藏。
  3. 验证与迭代:用 TVLA 或 CPA 对实现做统计评估,若 t 值超过阈值(常用 |t|>4.5 作为初筛),则回到泄漏点加固,直到通过评估。
示例参数(教学假设): 对 ML-KEM-768 的 NTT 实现做一阶 TVLA,采集 10000 条功耗曲线,固定明文、随机私钥,按中间值汉明重量分组。若某采样点 |t| 值达到 12,说明该点存在显著一阶泄漏,需检查该点对应的蝶形运算是否使用了秘密相关的条件分支或查表索引。该数值为教学示例,实际评估需根据设备与采集条件调整。

整体学习路线与章节安排

课程共 30 章,按“基础—实现—防护—评估—迁移”五个阶段推进。前几章建立 PQC 数学与标准基础,理解格、NTT、采样与编码;中间章节深入 ML-KEM、ML-DSA、SLH-DSA 的实现细节,重点讲解常量时间编程、掩码、隐藏与故障检测;后续章节进入侧信道评估方法、TVLA/CPA 实操、故障注入实验与安全等级判定;最后讨论混合部署、密钥生命周期管理与工程迁移中的实现安全实践。

需要强调的是,PQC 实现安全是一个快速演进的领域。标准在更新,攻击手法在进化,防护方案也在迭代。本课程提供的不是一成不变的“标准答案”,而是一套可复用的分析框架与工程方法:如何识别泄漏、如何选择防护、如何验证效果、如何在性能与安全之间做权衡。掌握这套方法,才能在面对新算法、新平台、新攻击时,快速做出正确判断。

常见误区: 认为“用了标准算法就安全”。实际上,同一算法在不同实现下侧信道安全性差异巨大。一个未做常量时间处理的 ML-KEM 实现,可能在简单计时攻击下就泄露私钥信息。实现安全必须与算法选择同等重视。