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 占用。对周期性上报的传感器节点,可将密钥协商放在连接建立阶段,避免在低功耗采样循环中触发大运算。
四、把画像落到选型决策上
完成上述估算后,可以用一张简单的判定表来收敛选型。以下参数为教学示例,实际项目应以目标芯片数据手册和实测为准。
| 平台示例 | 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% 以上的安全边际。
最后,资源画像不是一次性工作。算法实现版本升级、协议栈更换、OTA 分区调整都会改变预算。把画像参数(SRAM 余量、Flash 余量、周期数、能耗)作为版本发布前的检查项,才能避免在集成后期才发现平台“装不下”抗量子算法。