3. 嵌入式目标平台与资源画像

抗量子算法(PQC)迁移到嵌入式设备时,最先遇到的不是数学问题,而是资源问题。以 ML-KEM-768 和 ML-DSA-65 为例,它们的公钥、私钥、密文和签名尺寸比传统 ECC 大一个数量级,运算过程还涉及大量 NTT 变换和多项式采样。同一份算法实现在 Cortex-M4 上可能因 RAM 不足而无法运行,在 Cortex-A53 上却只占用不到 5% 的算力。因此,在选型与移植之前,必须为目标平台建立一份可量化的“资源画像”:它回答三个问题——芯片能提供什么、算法需要什么、两者之间的缺口如何填补。

一、从内核架构看能力边界

嵌入式目标平台大致分为三类。第一类是 Cortex-M 系列 MCU,如 M0+/M3/M4/M7/M33,主频通常在 24~480 MHz,SRAM 从几十 KB 到 1 MB 左右,无 MMU,通常运行裸机或 RTOS。M4/M7 带 DSP 指令和单周期 MAC,M33 带 TrustZone,适合做密钥隔离。第二类是 Cortex-A 系列 MPU,如 A53/A55/A72,主频 1 GHz 以上,带 MMU、NEON 和较大缓存,通常运行 Linux,适合网关、边缘节点等需要协议栈和文件系统的场景。第三类是 RISC-V MCU/MPU,如 RV32IMAC 的 GD32VF103、ESP32-C3,以及 RV64GC 的 K230、JH7110 等,其特点是可扩展自定义指令,部分型号提供向量扩展或加密扩展,为 PQC 的定制加速留下空间。

架构差异直接决定实现策略。Cortex-M4 没有硬件除法,ML-KEM 中的模逆和 Barrett 归约需要软件实现;M7 的双发射与分支预测能显著提升 NTT 流水效率;Cortex-A 的 NEON 可一次处理 4 个 32 位字,适合并行化蝶形运算;RISC-V 若具备 Zkn 加密扩展或自定义 NTT 指令,则可在指令级降低周期数。选型时应先确认内核是否支持所需的字长、乘加和位操作,再评估主频与存储。

二、内存层次与预算建模

PQC 的内存需求可分为栈、静态数据、堆和代码四部分。以 ML-KEM-768 为例,其公钥 1184 B、私钥 2400 B、密文 1088 B、共享密钥 32 B;ML-DSA-65 的公钥 1952 B、私钥 4032 B、签名 3309 B。这些是“存储尺寸”,而运算过程中的多项式数组、NTT 临时缓冲和采样状态才是 RAM 峰值的主要来源。一个典型的 ML-KEM 解封装实现,若采用原地 NTT,峰值 RAM 约 6~10 KB;若实现中保留多份多项式副本,则可能超过 20 KB。对只有 64 KB SRAM 的 M4 来说,这已接近可用余量的一半。

建模时建议按下面的方式估算,而不是凭经验拍脑袋:

RAM_peak = 栈峰值 + 静态密钥区 + 临时多项式区 + RTOS/协议栈开销
例(假设值,仅作教学演示):
  栈峰值        = 2.5 KB
  静态密钥区    = 3.5 KB(公私钥常驻)
  临时多项式区  = 8.0 KB(NTT + 采样 + 压缩缓冲)
  RTOS+协议栈   = 6.0 KB
  RAM_peak      = 20.0 KB
若 SRAM = 64 KB,则余量 44 KB,可接受;
若 SRAM = 32 KB,则余量仅 12 KB,需优化或换型。

Flash 侧同样要算。算法代码、常量表(如 ζ 的幂次表、Montgomery 常数)和查表数据合计通常在 15~40 KB 之间,若同时集成 ML-KEM 与 ML-DSA,代码量可能翻倍。对 256 KB Flash 的 M4,需为 bootloader、应用和 OTA 双分区预留空间,PQC 代码往往成为挤压点。

三、硬件加速器与功耗模式

多数 MCU 提供 AES、SHA、TRNG 和 PKA(公钥加速器)。PKA 通常针对 RSA/ECC 的大数模乘模幂设计,对 PQC 的 NTT 帮助有限,但可用于密钥封装中的随机数生成和哈希。真正有价值的是:带 DSP 的 M4/M7 可用 SIMD 指令加速 NTT 蝶形;Cortex-A 的 NEON 和 crypto 扩展可加速 SHA-3/SHAKE;部分 RISC-V 芯片的向量扩展可并行处理多项式系数。若芯片无硬件加速,则需评估软件实现的周期数是否满足时延要求。

功耗模式常被忽略。PQC 运算期间 CPU 处于活跃态,电流可达数 mA 至数十 mA;若设备由纽扣电池供电,一次 ML-KEM 封装可能消耗数毫焦耳。设计时应把 PQC 操作安排在唤醒窗口内,运算完成后尽快进入 STOP 或 STANDBY 模式,并利用 DMA 搬运密钥材料以减少 CPU 占用。对周期性上报的传感器节点,可将密钥协商放在连接建立阶段,避免在低功耗采样循环中触发大运算。

嵌入式平台资源画像与 PQC 需求匹配模型 平台能力(供给) 内核架构 Cortex-M0+/M4/M7/M33 Cortex-A53/A55 · RV32/RV64 主频 24 MHz ~ 1.5 GHz 存储层次 SRAM 32 KB ~ 1 MB Flash 128 KB ~ 8 MB Cache / TCM / 外部 PSRAM 加速与安全 DSP/MAC · NEON · 向量扩展 AES/SHA/TRNG/PKA TrustZone / 安全启动 功耗与实时性 Run / Sleep / STOP / STANDBY 唤醒时间 · 中断延迟 单次运算能耗(mJ 级) DMA 搬运密钥材料 资源预算匹配 RAM 峰值估算 栈 + 密钥区 + 多项式缓冲 + RTOS ML-KEM 约 6~20 KB(实现相关) Flash 代码与常量 单算法 15~40 KB 双算法叠加需预留 OTA 分区 周期与时延 M4 @168 MHz:ML-KEM 封装 约 10~30 ms(软件实现,示例量级) 能耗预算 活跃电流 × 运算时长 决定电池寿命与唤醒策略 判定条件 RAM_peak ≤ 0.7 × 可用 SRAM 时延 ≤ 业务超时 · 能耗 ≤ 预算 PQC 需求(消耗) ML-KEM-768 公钥 1184 B · 私钥 2400 B 密文 1088 B · 共享密钥 32 B NTT + 采样 + 压缩 ML-DSA-65 公钥 1952 B · 私钥 4032 B 签名 3309 B 拒绝采样 · 多次迭代 运算特征 大量 16/32 位模乘 SHA-3/SHAKE 哈希 随机数质量要求高 典型约束 握手阶段时延敏感 密钥常驻占用静态 RAM 签名验证可离线批处理 需抗侧信道实现

四、把画像落到选型决策上

完成上述估算后,可以用一张简单的判定表来收敛选型。以下参数为教学示例,实际项目应以目标芯片数据手册和实测为准。

平台示例 SRAM Flash ML-KEM 可行性 建议策略
Cortex-M0+ @48 MHz 32 KB 256 KB 紧张 仅做验证端,或改用轻量参数集并深度优化 RAM
Cortex-M4 @168 MHz 128 KB 1 MB 可行 软件实现 + DSP 加速 NTT,密钥分区存放
Cortex-M33 @160 MHz 256 KB 2 MB 可行且可隔离 TrustZone 划分安全区存放私钥,非安全区跑协议栈
Cortex-A53 @1.2 GHz 512 MB DDR eMMC 充裕 NEON 优化,作为网关侧集中处理 PQC 握手
RV32IMAC @144 MHz 64 KB 512 KB 需评估 利用自定义指令或加密扩展降低周期数

需要强调的是,上表中的“可行性”不是绝对结论,而是基于资源画像的初判。真正落地前,应在目标板上跑一次基准测试:记录 ML-KEM 封装的栈峰值(可用填充法测量)、代码段大小(用 size 工具查看 .text 与 .rodata)、单次运算周期数和活跃态电流。把这些实测值回填到预算模型中,才能确认余量是否满足 30% 以上的安全边际。

建模时优先关注“峰值”而非“平均值”。PQC 的 RAM 峰值往往出现在 NTT 中间层或拒绝采样的重试路径上,平均占用会低估风险。建议在实现中预留一块可复用的临时缓冲区,并在链接脚本中为其单独划分段,便于观察实际使用量。

最后,资源画像不是一次性工作。算法实现版本升级、协议栈更换、OTA 分区调整都会改变预算。把画像参数(SRAM 余量、Flash 余量、周期数、能耗)作为版本发布前的检查项,才能避免在集成后期才发现平台“装不下”抗量子算法。