4. 抗量子算法计算与存储需求剖析
在嵌入式设备上落地抗量子密码,第一步不是写代码,而是把“资源账”算清楚。NIST 后量子密码标准化选出的四类代表算法——用于密钥封装的 Kyber(ML-KEM)、用于数字签名的 Dilithium(ML-DSA)、Falcon 和 SPHINCS+——在数学结构上差异极大,直接导致密钥尺寸、运算复杂度和内存占用呈现数量级差别。本节围绕这三条资源维度,逐一剖析四种算法的工程特性,并给出嵌入式选型时的判断依据。
一、密钥与签名尺寸:先看“存储地板”
密钥尺寸决定了固件中静态存储的开销,也决定了协议报文的大小。以 NIST 第三轮及后续标准化的参数集为参考(具体数值以最终标准文档为准,此处为教学用近似值):
| 算法 | 公钥 | 私钥 | 密文/签名 | 典型安全等级 |
|---|---|---|---|---|
| Kyber-768 | 约 1184 B | 约 2400 B | 密文约 1088 B | NIST 3 级 |
| Dilithium3 | 约 1952 B | 约 4000 B | 签名约 3293 B | NIST 3 级 |
| Falcon-512 | 约 897 B | 约 1281 B | 签名约 666 B | NIST 1 级 |
| SPHINCS+-128s | 约 32 B | 约 64 B | 签名约 7856 B | NIST 1 级 |
这张表已经能读出关键结论:SPHINCS+ 的公私钥极小(仅哈希种子),但签名长达近 8 KB;Falcon 签名最短,适合带宽受限链路;Kyber 与 Dilithium 处于中间量级。对只有几十 KB RAM 的 MCU 而言,Dilithium3 的私钥加签名缓冲区就可能吃掉数 KB,必须在链接脚本中预留专用段,而不能依赖默认栈空间。
二、运算复杂度:乘法、NTT 与哈希次数
Kyber 和 Dilithium 都基于格问题,核心运算是多项式环上的乘法,工程上通过 NTT(数论变换)把 O(n²) 的卷积降为 O(n log n)。Kyber 的模数为 3329,Dilithium 为 8380417,后者需要 64 位中间结果,在 32 位 MCU 上乘法开销更高。Falcon 使用浮点 FFT 实现快速傅里叶采样与解码,对浮点单元(FPU)依赖明显,无 FPU 的 Cortex-M0/M3 上性能会显著劣化。SPHINCS+ 则是纯哈希构造,运算由大量 SHA-256 或 SHAKE 调用堆叠而成,单次签名可能涉及数万次哈希压缩,属于“计算换尺寸”的典型。
三、内存占用:栈、堆与工作区
内存要分三块看:静态密钥存储、运算栈峰值、临时工作区。Kyber 的 NTT 工作区较小,通常几百字节到 1 KB 量级;Dilithium 因多项式向量维度更大,栈峰值可达数 KB;Falcon 的 FFT 需要浮点数组,工作区与实现方式强相关;SPHINCS+ 的栈需求相对温和,但哈希状态与树遍历需要固定缓冲区。工程上应把工作区显式声明为静态数组或内存池,避免在中断上下文或小栈任务中调用签名函数。
四、嵌入式选型与工程落地
把上述特性映射到具体场景,可以形成几条可操作的判断规则。第一,若设备只需建立安全会话、报文预算紧张,优先选 Kyber,其密文约 1 KB,配合 TLS 1.3 混合密钥交换时对 MTU 影响可控。第二,若需要设备端签名且对签名长度敏感(如 LoRa、NB-IoT 上报),Falcon 的短签名有优势,但要确认芯片具备 FPU 或选用定点优化实现。第三,若追求实现简单、抗侧信道特性好、且能接受较大签名,SPHINCS+ 的哈希构造最易审计,适合固件签名等低频操作。第四,Dilithium 综合平衡,适合作为通用签名默认选项,但必须核算栈峰值。
一个常见的实操误区是只按公钥大小估算 Flash 占用。实际固件中,私钥往往需要安全存储区,签名缓冲区、NTT 旋转因子表、哈希常量表都要计入。以 Dilithium3 为例,私钥约 4 KB、签名约 3.3 KB,加上工作区,单次签名路径的 RAM 需求可能接近 10 KB,这在 64 KB RAM 的 MCU 上已占近六分之一,必须通过静态分配和调用时序控制来保证不与通信缓冲区冲突。