安全启动要验一个签名,这件事过去二十年由 ECDSA 或 RSA 完成。ECDSA P-256 的签名是 64 字节,P-384 是 96 字节。换成后量子算法,ML-DSA-87 的签名是 4627 字节。
体积涨了 72 倍,按常规判断是 MCU 装不下。两家厂商在不同平台上的实测数据指向另一个结论:慢的那部分不在算法本身。
一、一颗 M33 上的六种算法
wolfSSL 在 FRDM-RW612 上做过一组对比。芯片是 Cortex-M33,130MHz,没有内部 Flash,代码从外部 NOR 闪存 XIP 执行,验证对象是 7.5KB 的应用镜像。同一套 wolfBoot,六种签名算法:
签名算法 | 签名字节 | 验签耗时 | 引导程序大小 |
ECC P-256 | 64 | 24.9 ms | 27.6 KB |
ECC P-384 | 96 | 193.9 ms | 36.0 KB |
RSA-4096 | 512 | 45.4 ms | 20.3 KB |
ML-DSA-44 | 2420 | 30.6 ms | 24.2 KB |
ML-DSA-65 | 3309 | 42.5 ms | 24.9 KB |
ML-DSA-87 | 4627 | 63.3 ms | 25.5 KB |

图 1 同一颗 Cortex-M33 上六种算法的验签耗时,ECC P-384 最慢。数据来源:wolfSSL《wolfBoot Secure Boot for the NXP RW612》的实测表,2026 年 10 月 29 日,验证对象为 7.5KB 镜像
ML-DSA-44 只比 P-256 慢 23%,ML-DSA-87 是 P-256 的 2.5 倍;六种算法里最慢的一根柱子是 P-384,属于经典算法,是 P-256 的 7.8 倍。P-384 慢在椭圆曲线的域运算上,384 位的标量乘比 256 位重很多。
二、代价不在计算上
差的这部分来自两种算法在验签时做的事不一样。
ECDSA 验签要做两次椭圆曲线标量乘,一次算基点,一次算公钥。一次标量乘是几千次模乘,位宽越大越慢。
ML-DSA 验签做的是多项式向量乘加,模一个固定的素数,用 NTT 加速。签名里带的是挑战值的哈希、响应向量和提示位,验签方用矩阵和公钥重算出承诺,再比一次哈希。全程没有大整数运算,也没有曲线点乘。
代价转移到了别的地方:SHAKE 哈希。ML-DSA 验签里要跑多次 Keccak,软件实现慢就慢在这一块,这也是加 SHAKE 硬件加速之后收益最大的地方。
另有一组数据可以佐证。wolfSSL 把 ML-DSA-87 的 bootloader 和在 Cortex-M7 上跑的 ECDSA P-256 版本比,前者反而小了 940 字节,代码 21608 字节对 22548 字节。原因同样是运算类型:格验签不需要大整数库,椭圆曲线验签要。
三、体积落到了哪
省下的代码空间只有几百字节到几 KB,多出来的签名是每个镜像都要背的。

图 2 单个签名的字节数,传统算法与后量子算法。数据来源:FIPS 204、FIPS 205、SP 800-208,LMS H10 取 MCUXpresso TF-M 文档的 1912 字节,ECDSA 与 RSA 取常用参数集的标准长度
ML-DSA-87 的签名 4627 字节,公钥 2592 字节,两者相加 7219 字节。放进 256KB Flash 占 2.8%,放进 1MB 占 0.7%。
比例不大,影响落在四个地方。
OTA 包每发一个镜像多带 7.2KB,走 CAN 或低带宽无线链路时,这 7.2KB 是实打实的传输时间。
TLV 缓冲区要按以后可能采用的最大签名预留,不能按当前那个算。MCUboot 这类方案把签名放在镜像头的 TLV 区,今天上 ML-DSA-44,明天换 ML-DSA-87,中间差 2207 字节。
过渡期还要算双签。Microchip 给 dsPIC33A 的官方示例里,镜像同时带 ECDSA P-384 和 ML-DSA-87 两个签名,SHA-512 摘要打头,两个都验过才安装,代价是两套公钥和两个签名一起进 Flash。
全生命周期的写入量是第四处。走 LMS 这类有状态哈希签名,每签一次消耗一个私钥叶子,签名次数在出厂前就定死;设备端只验签,不受这个限制,签名端要有原子化的索引管理。
四、验签时间不跟镜像大小走
格签名的验签是固定成本。镜像变大,多出来的只有对镜像本身做一遍 SHA-256 的那部分。

图 3 左:镜像大 54 倍,验签只多 41%。右:同一颗芯片开 SHAKE 硬件加速前后。数据来源:wolfSSL 在 Cortex-M7 800MHz 的实测、Microchip 官方示例
Cortex-M7 在 800MHz 下验 ML-DSA-87,裸机测试程序 1004 字节,验签加启动 5.25 毫秒,折合 420 万个时钟周期;换成 54080 字节的 Zephyr 镜像,7.40 毫秒,592 万个周期。载荷大了 54 倍,周期只多 41%。
固件有几万行代码、镜像几百 KB 的产品,验签引入的开销可以忽略;反过来,只有几 KB 的小固件,固定成本占比会很高,这时候要不要预留几十毫秒的开机时间就要算一下。
五、四家的做法
硬件加 SHAKE 是最直接的一招。Microchip 给 dsPIC33A 的部分器件加了 SHA-3 和 SHAKE 引擎,官方示例给出的数据是 ML-DSA-87 验签由 46.378 毫秒降到 11.683 毫秒,编译优化 -Os,降幅 75%。工程默认开的是 -O1,那个配置下大约是 15 毫秒。加密加速器本身覆盖 AES、SHA-2、ECC、RSA 和 TRNG,SHA-3/SHAKE 引擎是另配的,专门给 ML-DSA 和 ML-KEM 用。

图 4 Microchip 官方示例仓库的说明页:SHA-512 摘要打头,ECDSA P-384 与 ML-DSA-87 双签,ML-DSA-87 验签由 46.378 毫秒降到 11.683 毫秒。来源:GitHub 仓库 microchip-pic-avr-examples/dspic-bootloader-mdfu,dsPIC33AK256MPS306 示例 README
把 PQC 做进 SDK 是第二条路。瑞萨从 FSP 6.4.0 起,在 MCUBoot 的加密栈里加入 PQC 支持,镜像签名和运行时的镜像验证可以用 ML-DSA-44、ML-DSA-65、ML-DSA-87 三种参数集,选哪个由开发者按 Flash 和 RAM 的余量决定。这条路不改硬件,代价是全软件实现,验签时间取决于主频和编译优化。
第三条是混合签名。Microchip 的 dsPIC33A 官方示例把 ECDSA P-384 和 ML-DSA-87 绑在一起,任何一个验不过就拒绝安装。这是迁移期的稳妥做法,代价主要在验签时间:两个签名是先后各验一遍,按 M33 那组数据算,193.9 毫秒加 63.3 毫秒约 257 毫秒,等于单签 ML-DSA-87 的四倍。体积增加不多,两个签名加起来 4723 字节,比单签 ML-DSA-87 只多 96 字节。另一个代价是防降级:一旦强制了双签,就不能允许退回只用经典算法。
第四条是专用硬件加哈希签名。英飞凌在 PSOC Control C3 的 Main Line 上把 SHA-2 384/512 做成硬件加速器,再加一个 LMS 验签引擎,用在安全启动和固件更新。
LMS 的签名长度由参数集定死,和镜像多大无关。NXP 在 MCUXpresso 的 TF-M 文档里给的数是公钥 32 字节、SHA256_H10 配 Winternitz 8 的签名 1912 字节。32 字节只是 Merkle 树的根;签名里装的是 34 条 Winternitz 链,每条一个 32 字节的哈希值,加 32 字节随机值,再加 10 层认证路径,每层 32 字节,末尾是几段 4 字节的头。文档给的是总数,没列分项,预留 Flash 按 1912 算。验签全程只做哈希,正好吃满这颗芯片的 SHA-2 加速器。

图 5 MCUXpresso SDK 的 TF-M 文档中 BL1_2 的后量子验签一节,公钥 32 字节、签名 1912 字节出自此处。来源:NXP MCUXpresso SDK 文档《BL1 Immutable bootloader》
六、为什么 CNSA 2.0 指定 LMS
NSA 的 CNSA 2.0 在固件签名这一项上点名的是 LMS 和 XMSS,两者都出自 SP 800-208。原因不在性能。
LMS 基于 Merkle 树,安全性只依赖底层哈希函数,不引入新的数学难题假设。格密码虽然在密码分析上站得住,但它的安全假设比哈希函数年轻得多,一条要服役二十年的信任根,选假设更少的那个更稳。
代价是有状态。LMS 的私钥是一组一次性密钥,每个叶子只能用一次,签两次同一个叶子,攻击者就能伪造。所以签名端必须先把索引写进持久存储再出签名,且禁止备份、克隆和快照。SP 800-208 的要求是签名在硬件密码模块里完成,纯软件实现不算合规。
设备端没有这个问题。设备只验签,公钥和树根是固定的。选型时常有人把这个限制套到整条链上,实际上它只约束签名那一端。
时间表是硬的。CNSA 2.0 要求固件签名从 2025 年起优先支持、2030 年起独占,2027 年 1 月 1 日之后的新采购必须合规,2035 年全面完成。欧盟的 CRA 是另一条线,主要义务 2027 年 12 月 11 日适用,制造商要在整个支持期内提供安全更新。
七、怎么选
固件可以更新的产品,用 ML-DSA。无状态,验签不依赖索引管理,参数集按 Flash 余量选,一般用 65,空间特别紧就 44,高保证场景用 87。
出厂后不能改的 ROM 信任根,用 LMS 或 XMSS。密钥锁在 HSM 里,私钥叶子范围提前分好,公钥的哈希烧进熔丝。
过渡期要不要双签,看客户或法规是否强制。要双签,就把“两个签名都必须通过”写进受保护的位置,不要放在配置文件里。
硬件加速要不要加,看开机时间预算。46 毫秒和 11.7 毫秒的差别,对常年通电的工业设备不算什么,对每次唤醒都要重启的电池设备就是另一回事。
这几项现在都有实测数据可以查,不用再按“后量子太重 MCU 跑不动”这个印象做判断。
数据来源:wolfSSL 对 FRDM-RW612 与 Cortex-M7 的验签实测、Microchip dsPIC33A 安全启动与 MDFU 引导程序官方示例(1.3.0)、瑞萨 RA MCU 知识库 FSP 6.4.0 PQC 说明、英飞凌 PSOC Control C3 Main Line 产品简介与新闻稿(2026 年 10 月 19 日)、FIPS 204、FIPS 205、RFC 8554 与 SP 800-208、CNSA 2.0 时间表
------------ END ------------