简介:面向芯片设计、密码工程与后量子安全领域的专业文档,系统讲解基于格密码(NTRU、Ring-LWE、CRYSTALS-Kyber等)的抗量子攻击芯片实现,覆盖从模算术单元、多项式乘法器到KEM/签名方案硬件映射、低功耗与抗侧信道设计等完整链路,适合需要落地后量子密码硬件方案的工程师与研究人员。包体为单个PDF文件,共367页、50个大章节,压缩包大小约11.93MB,支持目录跳转与书签大纲,结构清晰便于按需查阅。已有69人学习下载。文档前19章围绕格密码算法选型、核心运算单元、NTT加速、LLL流水线、存储架构、模约简电路及密钥生成等展开,并给出CRYSTALS-Kyber/Dilithium硬件适配、Montgomery模逆Verilog示例等具体内容;后续章节还涉及动态参数调整、吞吐量优化、时序与低功耗策略,能为实际芯片设计提供从理论到实现的参考。
1. 项目概述:量子威胁从论文变成了工程清单
1.1 这份方案到底在解决什么问题
做安全芯片这行越久,越能感受到一个行业趋势:后量子密码已经不是停留在学术论文里的概念,而是实实在在进入了芯片级的工程落地阶段。这份367页的详细设计,针对的就是一个非常具体的场景——如果量子计算机真的具备破解RSA和ECC的能力,当前设备里的公钥密码体系会全面失效,那新设计的抗量子攻击芯片,就必须采用新的密码原语来保证身份认证和密钥协商的安全性。
方案锁定了格密码路线,围绕NIST标准化的ML-KEM(密钥封装机制)和ML-DSA(数字签名算法)完成了算法选型、微架构设计、硬件加速器实现、认证流程联调的全链条设计。整份内容既有顶层系统架构,也有模块级时序细节,甚至包含了故障注入和侧信道攻击的防护策略。说实话,能在一份文档里把算法、硬件、协议和安全测评串得这么完整的,市面上不多见,我拿到手的时候第一反应是:这可以直接拿来指导流片前的RTL验证了。
1.2 适合谁参考
如果你和我一样,日常工作是设计安全MCU、车规认证芯片、物联网安全模组,或者正在帮整个产品线做后量子迁移规划,这份方案的参考价值很高。它不是那种只讲概念的PPT,而是真的把芯片内部怎么分解算法、NTT怎么流水、内存带宽怎么算、认证握手中签名和封装怎么配合,全部掰开揉碎地讲清楚了。
我身边有些做嵌入式软件的同学,可能觉得“密码硬件设计”离自己很远,但如果你要写的驱动要对接一颗新出的PQC加速器,或者要优化认证流程的时延,这份方案里关于握手时序和指令调度的内容同样有用。它本质上是一份“懂硬件的人写给软硬件开发者”的完整工程地图。
1.3 方案的大致结构
从结构上看,文档分了四大块:第一块是算法选型和安全需求分析,解释为什么当前场景不能继续用RSA/ECC;第二块是硬件微架构设计,包括NTT加速器、多项式运算单元、采样模块和存储优化;第三块是实时安全认证的完整流程,从证书解析到会话密钥建立;第四块是物理攻击防护与测试验证方法。这种分层方式很务实,先把“为什么这么做”讲透,再讲“具体怎么实现”,最后落到“怎么证明它安全、怎么测性能”。
2. 为什么是格密码:后量子选型的底层逻辑
2.1 多路线对比里,格密码为什么综合胜出
后量子密码的候选路线不少,基于哈希的签名(如XMSS)、基于编码的方案、基于多变量的方案,还有格密码。方案里做了一个很清晰的对比:哈希签名虽然实现简单,但签名尺寸和状态管理在嵌入式环境里很尴尬;编码方案公钥动辄几百KB,芯片片上存储根本扛不住;多变量方案则长期存在审计不充分和密钥膨胀的问题。
格密码的优势在于三点:密钥和签名尺寸适中、运算结构规整适合硬件加速、安全假设经过多年分析相对稳定。尤其是基于模格的ML-KEM和ML-DSA,已经被NIST正式纳入标准化,生态和评测工具都比较成熟,不会出现“算法选型做完才发现全世界只有几篇论文在用”的窘境。
2.2 NIST标准算法的关键参数
方案在选型上直接用了ML-KEM和ML-DSA,没有考虑Falcon等算法,理由是:Falcon虽然签名更小,但其离散高斯采样在硬件上实现难度大,难以做到常数时间,认证芯片对这种细节非常敏感。
我整理一下方案里给出的核心参数,方便对照:
| 算法 | 安全强度 | 公钥大小 | 密文/签名大小 | 主要运算开销 |
|---|---|---|---|---|
| ML-KEM-768 | AES-192级 | 1184字节 | 1088字节 | 多项式乘、NTT、CBD采样 |
| ML-KEM-1024 | AES-256级 | 1568字节 | 1568字节 | 多项式乘、NTT、CBD采样 |
| ML-DSA-65 | AES-192级 | 1952字节 | 3309字节 | 多项式乘、NTT、拒绝采样 |
| ML-DSA-87 | AES-256级 | 2592字节 | 4627字节 | 多项式乘、NTT、拒绝采样 |
这些数字决定了芯片内部存储器的容量规划。比如ML-DSA-87的签名接近4.6KB,认证帧缓冲区就要留足空间,不能只算一个签名的大小,还要算上协议头、证书链和随机数。
2.3 KEM和签名组合如何服务实时认证
实时安全认证需要两件事:确认对方“是谁”(身份),以及协商出一个只有双方知道的会话密钥。格密码给了两个工具:ML-KEM负责密钥封装,用公钥加密一个临时密钥,只有持有对应私钥的人能解开;ML-DSA负责签名,证明某个消息确实由持有私钥的一方发出。
实际流程里两者经常是嵌套的:设备先用ML-DSA对认证请求签名,服务端验签通过后,再用ML-KEM封装一个会话密钥回传,设备解封装后双方开始用对称加密通信。这种“先验签、再建钥”的顺序,能避免在身份确认前就浪费随机数和计算资源。
3. 芯片硬件架构与核心模块设计
3.1 CPU加专用加速器的整体分工
这颗抗量子攻击芯片没有一上来就搞全定制硬核,而是采用了“通用CPU + 密码加速器”的经典架构。CPU(RISC-V内核)负责协议解析、证书处理、中断调度和上层业务逻辑,密码加速器则只干一件它最擅长的事:高频次、高并行度的多项式运算。
这种分工的产生原因很简单,一颗中端安全MCU的主频通常在100MHz到300MHz之间,纯软件跑ML-KEM的封装操作往往需要几十毫秒,而实时认证的场景通常希望在几毫秒到十几毫秒内完成一次握手。CPU做不了,是因为格密码里的NTT和点乘运算天然适合并行流水线,而程序计数器一条条取指执行的方式效率太低。方案里的加速器在100MHz工作频率下,单次ML-KEM封装能做到约0.3毫秒,差距就体现在这里。
3.2 NTT加速器的设计要点
格密码里最核心的运算是多项式环上的乘法,直接做卷积复杂度是O(n²),而用NTT(数论变换)可以把复杂度降到O(n log n)。方案里的NTT加速器是为ML-KEM和ML-DSA共用设计的,两个算法的模数和向量长度不同:ML-KEM的n=256、q=3329,ML-DSA的n=256、q=8380417。
硬件上用了两级流水线的蝶形运算单元,每个周期同时处理两组数据,配合旋转因子的ROM表,可以做到一个蝶形运算约一个周期。我特别想提醒一点:旋转因子的存储顺序和正变换、逆变换的加载顺序非常容易搞混。方案里反复用了NIST给出的KAT向量做比对,一旦旋转因子表顺序错,输出结果完全对不上,而且这种错不会在逻辑仿真第一轮立刻暴露,通常要跑到中间轮数才会崩。
3.3 采样模块与哈希扩展单元
格密码除了多项式乘法,还依赖两种采样:中心二项分布采样(CBD)和拒绝采样,分别用于ML-KEM的密钥错误生成和ML-DSA在签名过程中生成掩盖向量。采样模块虽然是辅助角色,但直接影响安全性和签名成功率,如果采样偏了,要么泄露私钥信息,要么签名验签失败需要重试,实时性就毁了。
哈希扩展单元也值得注意。ML-KEM和ML-DSA都依赖SHAKE128/SHAKE256把种子扩展成伪随机字节流,这个扩展速度决定了密钥生成的快慢。方案里用了一个专用的SHAKE核心,输出数据通过FIFO喂给采样模块,避免CPU一次一次搬运短期数据。实测下来,这种做法让密钥对生成时间缩短了三分之一以上,效果非常明显。
3.4 存储布局与数据搬运优化
格密码运算有一个隐含的硬件压力:中间数据量不大,但流动极频繁。一个多项式是256个16位系数,约512字节,但每次NTT、逐点乘、逆NTT都要把数据读出来、算完、写回去,带宽翻了好几倍。方案的做法是在加速器旁边放一块专用的SRAM作为工作区,尺寸大约是8KB到16KB,这足以容纳ML-KEM-1024和ML-DSA-87的最大中间状态。
数据搬运用的是DMA,不是CPU。CPU只需要向加速器写一条控制命令,里面包含操作类型、源地址、目的地址和数据长度,加速器完成一个批次运算后通过中断通知CPU。这样一个“命令—中断”的事务模型,能保证CPU在等待运算期间去干别的协议处理,时间上重叠起来,整体握手时延明显下降。
4. 实时安全认证流程的实现与优化
4.1 一次双向认证握手的时序拆解
方案把实时安全认证的完整时序画得很细。以设备和服务器的双向认证为例,核心步骤分成六个阶段:
- 设备发起认证请求,附带设备证书和一次性随机数nonce。
- 服务器校验证书链,确认设备身份可信,然后生成自己的nonce返回。
- 设备生成ML-KEM临时密钥对,用服务器公钥封装会话密钥,同时用设备私钥对nonce做ML-DSA签名。
- 服务器解封装得到会话密钥,再验证设备签名。
- 双向握手完成后,双方便可以用会话密钥走AES-GCM的加密通道。
这六个阶段里,最容易成为瓶颈的是第3步和第4步,因为要连续执行两次公钥运算。方案做了一个很细的优化:当服务器在验证设备证书链的时候,设备端可以先预计算ML-DSA签名的哈希部分,只留最后对nonce的签名运算在握手中执行。这看起来是个小调整,实测能把整体握手时延减少接近20%。
4.2 让密码运算和协议解析重叠起来
实时性优化不能只靠加速器跑得快,还要靠任务调度。方案里把整个认证流程拆成四个独立任务:协议解析、证书验证、PQC运算、对称加密,并在一个轻量级RTOS上做了流水线编排。PQC运算在硬件加速器里跑的时候,CPU同时去做证书链解析;硬件加速器空闲时,CPU已经准备好下一批数据,避免一方等另一方。
我在自己的项目里复制过这种设计,有一个经验想分享:中断优先级要设计好。PQC运算完成中断如果优先级比协议解析任务里的某个外设中断低,会出现运算已经算完但CPU迟迟不处理的情况,反而把流水线拖垮。常规做法是把加速器完成中断设为高优先级,然后在中断服务函数里只做最小必要操作,把具体数据处理丢给高优先级任务,不要在中断里做太多事。
4.3 与现有PKI体系怎么平滑共存
现实世界里的PKI体系,短期内不可能全部换到后量子算法,所以方案设计了一个混合模式:证书链里同时包含传统ECDSA证书和后量子ML-DSA证书,握手时两种算法并行执行,只要一种算法链路通过,就可以继续后续流程。这样做的目的是灰度迁移,老设备用老协议,新设备自动升级到更强的PQC认证。
这种混合模式对芯片的算力要求高一点,因为要做两套公钥运算,但在硬件加速器面前压力不大。对业务系统而言,好处是可以让后量子迁移分阶段进行,先保证新老设备互通,再逐步下线传统算法,避免“切换当天全网故障”。
5. 硬件安全防护:抗量子的同时也要抗物理攻击
5.1 侧信道攻击与掩码对策
“抗量子攻击”不代表芯片物理上就安全了。恰恰相反,格密码的运算过程对功耗波形非常敏感,私钥相关的中间值如果直接暴露在电路中,攻击者用几万条功耗曲线做差分分析,就能把私钥测出来。方案在NTT路径上做了算术掩码,把敏感多项式拆分成两个随机共享份,所有运算都以共享份的形态进行,最后再合并结果,这样单条功耗曲线上看不到完整的私钥信息。
掩码的开销是实打实的,面积和功耗大概增加30%。方案在实时认证场景里做了一个取舍:只有涉及私钥的运算(签名、解封装)加掩码,涉及公钥的运算(验签、封装)不加,因为公钥本身就是公开的,没必要为它付出性能代价。这个思路我觉得很实用,安全性不是“全有或全无”,而是在满足攻击面要求的前提下控制成本。
5.2 故障注入防护
攻击者还有一个常见手段是往芯片上打激光或者注入时钟毛刺,让运算过程出错,从而诱导出错误结果,再通过差分错误分析破解私钥。方案对此做了两道防线:第一道是运算结果校验,在密码运算结束后把结果重新加密一次对比,虽然时间翻倍,但能发现绝大多数注入故障;第二道是在关键控制状态机里加循环冗余校验,寄存器被篡改时状态机会主动进入错误处理流程,不会把错误数据输出到协议层。
这两道防线听起来简单,但实现时坑很多。首先是结果校验不能只是把输出算一遍再比,因为如果注入故障发生在校验逻辑本身,攻击者依然能绕过;方案的做法是让校验逻辑和主运算逻辑使用不同的硬件路径,降低被同时攻击的概率。其次是故障响应不能只报错就清零,应该记录错误事件并触发安全中断,让上层固件决定是重试还是进入锁死状态。
5.3 随机数安全设计
格密码对随机数的质量要求比传统密码高得多,因为掩码、采样和nonce全部依赖高质量的熵源。方案采用真随机数发生器(TRNG)加DRBG后处理的架构,TRNG负责从电路噪声中提取熵,DRBG负责把熵扩展成任意长度的随机序列。在认证握手前,软件可以调用一次DRBG的状态刷新,确保每次握手的随机数序列不可预测。
这里有一个很容易被忽略的点:DRBG不能访问失败就返回一个固定种子。方案里的错误处理是,如果TRNG健康测试连续失败三次,芯片直接进入安全锁定状态,拒绝发起任何认证,而不是退回到一个确定性随机源。我遇到过有些项目为了省事,在TRNG故障时用系统时钟做伪随机,这在产品送测的时候几乎一测一个准,属于原则性错误。
6. 常见调试问题与排查经验
6.1 高频问题速查
我把这份方案里反复出现、以及我自己实测中踩过的问题整理成一张速查表,方便对照:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 硬件加速器输出与软件参考模型不一致 | NTT旋转因子顺序错误或模约减处理不对 | 用NIST KAT向量分阶段比对,定位到具体算子 |
| 认证握手时延远高于预期 | CPU等待中断时被低优先级任务抢占 | 检查中断优先级配置,缩短中断服务函数 |
| 随机数接口返回全零或固定值 | TRNG健康测试失败回退逻辑错误 | 查看DRBG状态寄存器,检查是否进入安全锁定 |
| 签名偶尔验签失败 | 拒绝采样次数超限,随机数偏置 | 增加DRBG刷新次数,检查采样模块熵源质量 |
| 功耗曲线出现明显尖峰 | 掩码路径里某个异或或加法时序不平衡 | 用仿真功耗分析工具跑一遍,找出非恒定时间路径 |
| 协议层收到的帧不完整 | 认证缓冲区太小或DMA配置地址越界 | 按最大签名加协议头计算缓冲区,检查DMA描述符 |
6.2 验证方法和踩坑记录
方案在验证上采用的是“三阶段阶梯验证法”:第一阶段用纯软件参考模型跑通算法流程,确认协议没问题;第二阶段把参考模型的数据输入到硬件RTL仿真里,逐模块比对输出;第三阶段上FPGA原型平台,接真实操作系统和网络协议栈,测完整握手时延和并发压力。
这个流程里我最想提醒的是第一步不能偷懒。有人觉得算法实现既然抄的是标准库,没必要再跑参考模型,结果直接上硬件测,出了问题要回头排查到底是硬件bug还是算法边界条件没处理好,反而更慢。我自己的习惯是,哪怕参考模型已经验证过,也要保留一套独立的Python实现,专门用来生成随机边界用例,比如模数临界值、签名失败重试、掩码共享份全零等,这些用例比正常路径更能暴露硬件设计缺陷。
另外在FPGA原型验证阶段,建议把时钟频率先调到实际目标的四分之一跑通功能,再逐步提频,有些时序问题在高频下会表现为随机数据错误,很难定位。半速调试这个习惯,帮我省掉了好几次“查了一整天发现是setup time violation”的惨痛经历。
最后说几句实在话
整套方案做下来,我个人最大的体会是:后量子密码硬件设计,难点从来不在“看懂算法公式”,而在于把算法拆成硬件喜欢的高并行结构,再把安全防护的约束从架构阶段就考虑进去。掩码如果在RTL写完之后再加,代价会大到让你怀疑人生;KAT向量如果不从模块级就开始比对,到最后联调时定位bug的成本会指数级上升。
如果你准备做方向类似的芯片,我的建议是先把ML-KEM和ML-DSA的软件参考实现完整跑通,再去看硬件架构,最后拿到一份成熟的参考方案做对照。这个顺序不要反了,软件层的理解深度,直接决定了硬件设计里那些“看起来多余”的余量安排是否合理。希望大家都能绕开我踩过的坑,一次就把时序和安全性做扎实。
本文还有配套的精品资源,点击获取