2. 抗量子算法家族与嵌入式适配约束

抗量子密码(PQC)并不是某一种算法,而是若干条数学路线并行发展的算法家族。NIST 后量子标准化进程最终选定的路线主要落在四类数学结构上:格基(Lattice)、哈希(Hash-based)、编码(Code-based)和多变量(Multivariate)。对嵌入式开发者而言,理解这些家族的差异,重点不在于推导数学证明,而在于看清它们各自消耗什么资源——密钥与签名的体积、运算中的大数/多项式操作、内存峰值、随机数需求,以及能否在中断驱动的实时系统中安全地跑完。

四个家族的资源画像

格基算法是当前最主流的路线,代表是用于密钥封装的 ML-KEM(原 Kyber)和用于签名的 ML-DSA(原 Dilithium),以及偏重小签名的 Falcon。格基运算的核心是多项式环上的乘法与采样,通常用 NTT(数论变换)加速。它的特点是:密钥和密文体积中等(ML-KEM-768 公钥约 1184 字节、密文约 1088 字节),运算以定长多项式为主,内存访问模式规整,非常适合在 Cortex-M4/M33 这类带 DSP 指令的 MCU 上做常数时间实现。代价是需要较大的栈空间和较多样本缓存,且对侧信道防护要求高。

哈希算法以 SPHINCS+ 为代表,安全性只依赖哈希函数的抗碰撞性,数学假设最保守。但它的签名体积极大(常见参数集在 8KB~50KB 量级),签名过程需要大量哈希调用和树结构遍历,属于“计算换体积”的典型。它适合签名频率低、存储不紧张的场景,比如固件根信任的一次性签名,而不适合每包都签的通信链路。

编码算法以 Classic McEliece 为代表,公钥极大(数百 KB 到 MB 级),但密文很短、加解密运算量相对可控。它的瓶颈几乎完全落在 Flash 上,对 RAM 和算力反而不苛刻,适合公钥可预置、不需频繁分发的设备。

多变量算法(如已进入后续评估的 Rainbow 类方案,以及 UOV 系列)签名短、验签快,但公钥较大,且历史上多次因结构攻击被削弱,工程选型时需格外关注参数集的成熟度。

抗量子算法家族的嵌入式资源画像 横轴:资源压力方向 纵轴:四类数学结构 RAM 峰值 Flash 占用 算力/周期 实时性风险 典型代表 格基 Lattice 中 中 中高 中 ML-KEM ML-DSA 哈希 Hash-based 中 大 大 高 SPHINCS+ 签名 8–50KB 编码 Code-based 中 极大 中 中 McEliece 公钥数百KB 多变量 Multivariate 中 大 低 低 UOV 系列 签名短 压力较低 压力中等 压力较大 压力极大

RAM 与 Flash:先算清“放不放得下”

嵌入式适配的第一道门槛是存储。以一颗 256KB Flash、64KB RAM 的 Cortex-M4 为例,若同时集成 ML-KEM-768 与 ML-DSA-44,仅算法代码(含 NTT 表、采样器、SHA-3/SHAKE 实现)通常就要占用 30~60KB Flash,密钥与中间缓冲区再占去数 KB 到十几 KB RAM。若再叠加 SPHINCS+,其签名缓冲区与树遍历栈很容易突破 20KB,此时必须重新评估任务栈划分。

工程上建议先做一次静态预算,而不是等链接报错再回头砍功能。下面是一份可直接套用的资源预算表模板(数值为示例假设,需按实际编译结果替换):

项目Flash 预算RAM 峰值预算说明
ML-KEM-768 代码+常量约 22KB约 6KB含 SHAKE 与 NTT 表
ML-DSA-44 代码+常量约 28KB约 9KB签名栈较深
SPHINCS+(低签名频率)约 15KB约 18KB仅用于根信任
协议栈与业务约 120KB约 24KB原有系统占用
余量(建议 ≥15%)——为 OTA 与日志预留

判断依据很直接:把上表各项相加,若 Flash 合计超过器件容量的 85%,或 RAM 峰值加上最大中断嵌套栈后超过 80%,就应削减算法组合或改用外部 Flash 存放公钥。

算力、能耗与实时性:算清“跑不跑得完”

算力约束要看最坏情况而非平均值。以 80MHz 的 Cortex-M4 为例,ML-KEM-768 的封装/解封装在优化实现下大致在数百万到千万周期量级,换算成时间是几十到一百多毫秒;ML-DSA 签名则更重,可能达到数百毫秒。这些数字必须与系统的实时性要求对齐:如果设备每 500ms 上报一次且需逐包签名,ML-DSA 就会挤占主循环;若只是会话建立时做一次密钥封装,则完全可接受。

能耗方面,抗量子运算的能耗主要来自长时间连续计算和频繁的 Flash 读取。一个实用做法是把重运算放在唤醒后的“计算窗口”内集中完成,随后立即进入低功耗模式,而不是让算法在多个中断之间被反复打断——后者不仅增加总能耗,还会因上下文保存拉高峰值 RAM。实时性上,务必确认算法实现是可重入且常数时间的,避免在中断上下文中调用带动态内存分配的封装接口。

选型经验:优先用 ML-KEM 承担密钥交换,用 ML-DSA 承担设备身份签名;SPHINCS+ 只放在启动阶段的根信任验证;编码类算法仅在公钥可预置且 Flash 充裕时考虑。任何组合都应先在小容量目标板上做一次真实编译与周期测量,再定参数集。

最后要强调的是,算法家族的选择不是“越安全越好”,而是在安全等级、存储、算力、能耗与实时性之间找可行交点。把上述预算表与周期测量结果放在一起对照,才能判断某个参数集在这颗芯片上究竟是“能跑”还是“跑得稳”。