3. 密码学硬件实现:对称加密(AES)硬件加速器设计、非对称加密(RSA/ECC)协处理器、真随机数发生器(TRNG)设计要点

密码学硬件,说白了就是把数学算法焊进硅片里。我做了十几年安全芯片,最深的体会是:软件上跑得通的算法,到了硬件里全是坑。时序、面积、功耗、侧信道泄漏,每一个都能让你流片回来哭。

这一章咱们就聊聊三种最核心的密码硬件模块:AES加速器、RSA/ECC协处理器、TRNG。我会把我在项目中踩过的坑、总结的经验,一股脑倒出来。

3.1 AES硬件加速器设计

AES是目前最主流的对称加密算法。硬件实现时,核心矛盾就一个:面积 vs 吞吐率。

3.1.1 架构选择:全流水 vs 迭代

架构类型 面积 吞吐率 延迟 典型场景
全流水(10轮展开) 大(约50K门) 1 clk/block 10 clk 高速网络加密
迭代(单轮复用) 小(约12K门) 10 clk/block 10 clk IoT、智能卡
部分流水(2-5轮) 中(约25K门) 2-5 clk/block 10 clk 嵌入式系统

我个人习惯,在项目初期先用迭代架构把功能跑通。等时序收敛了,再根据面积余量决定要不要加流水。你想想看,一上来就搞全流水,万一后端说面积超标,改起来太痛苦。

3.1.2 S-Box实现:查表 vs 组合逻辑

S-Box是AES里最吃资源的模块。实现方式有两种:

  • ROM查表:简单直接,但每个S-Box要256字节。10轮全流水需要20个S-Box(加解密各10个),光这就吃掉5K门。
  • 组合逻辑:用有限域GF(2^8)上的逆运算+仿射变换实现。面积小,但关键路径长。
我的经验:对于128位数据路径,我建议用Block RAM实现S-Box。FPGA上BRAM是免费的,ASIC上RAM也比寄存器阵列省面积。但要注意——BRAM的读延迟是1个时钟,你得在流水线里把这个延迟算进去。

3.1.3 密钥扩展的硬件化

密钥扩展有两种做法:在线计算和预计算存储。

  • 在线计算:每轮实时算Round Key,省存储,但每轮多一个S-Box操作。
  • 预计算:一次性算好10个Round Key存起来,面积大,但每轮直接读。

我做过一个项目,客户要求密钥能随时切换。在线计算的方式就出问题了——切换密钥后,第一笔数据要等10个时钟才能出结果。后来改成预计算+双缓冲,才解决了这个问题。

3.1.4 侧信道防护:掩码(Masking)

嗯,这里要注意。AES硬件如果不做防护,功耗分析攻击能直接把密钥扒出来。我见过一个团队,流片回来才发现功耗曲线和密钥汉明重量高度相关,那叫一个惨。

常用的防护手段是布尔掩码:

// 一阶布尔掩码示例
// 明文 m,掩码 r,掩码数据 m_r = m ^ r
// S-Box 需要特殊设计:S'(m_r, r) = S(m) ^ r'
// 其中 r' 是新的掩码

// 实际操作:
// 1. 生成随机掩码 r
// 2. 计算 m_r = m ^ r
// 3. 通过掩码S-Box计算 S'(m_r, r)
// 4. 输出 S(m) ^ r'
避坑指南:我曾经在一款芯片上用了自己写的掩码S-Box,结果综合后面积暴增40%。后来发现是综合工具把组合逻辑优化掉了,掩码效果全没了。解决办法是:在RTL里手动例化,并用综合属性禁止优化。

3.2 非对称加密协处理器:RSA与ECC

非对称加密的硬件实现,核心是大数运算。RSA需要1024-4096位的模幂运算,ECC需要256-521位的点乘运算。说白了,就是让硬件能算超大整数的乘法和加法。

3.2.1 RSA:Montgomery模乘器

RSA的核心运算是模幂,而模幂的核心又是模乘。直接算模乘需要除法,硬件实现太贵。所以业界都用Montgomery模乘。

Montgomery模乘的硬件架构:

  • CSA(Carry Save Adder)树:把多个部分积压缩成两个数(和+进位)
  • 最终加法器:把CSA的结果合并
  • 减法校正:如果结果大于模数,减一次

我记得有一次做2048位RSA,用CSA树把关键路径压下来了,但最终加法器用了超前进位加法器,面积还是大。后来改成流水线加法器,面积降了30%,代价是多了一个时钟的延迟。

3.2.2 ECC:点乘与坐标系选择

ECC的点乘运算,说白了就是一堆点加和倍点操作。坐标系的选择直接影响性能:

坐标系 点加(模逆次数) 倍点(模逆次数) 特点
仿射坐标 1次模逆 1次模逆 直观,但模逆太慢
Jacobian投影坐标 0次模逆 0次模逆 快,但最后要转回仿射
混合坐标 0次模逆 0次模逆 一个仿射+一个投影

我建议ECC协处理器全部用Jacobian投影坐标。虽然最后需要一次模逆来转换坐标,但整个点乘过程省掉了上百次模逆,划算得多。

3.2.3 协处理器与主核的接口设计

协处理器不是独立存在的,它要和CPU核通信。接口设计有几个要点:

  • 寄存器映射:把操作数、结果、控制状态映射到CPU的地址空间
  • DMA支持:大数运算的数据量很大,用CPU搬数据太浪费
  • 中断机制:运算完成后通知CPU
关键指标:协处理器的启动延迟和数据搬移带宽往往比计算单元本身的性能更重要。我见过一个设计,模乘器只用了5个时钟,但数据搬来搬去花了50个时钟,得不偿失。

3.3 真随机数发生器(TRNG)设计要点

TRNG是所有密码系统的根基。密钥、掩码、随机数,全指着它。TRNG要是挂了,整个芯片的安全就形同虚设。

3.3.1 熵源选择

芯片上的熵源就那么几种:

  • 环形振荡器抖动:最常用,用反相器环的相位噪声
  • 亚稳态采样:利用触发器的亚稳态,但可靠性差
  • 热噪声放大:用电阻热噪声,模拟电路,面积大
  • 量子效应:比如隧穿效应,但工艺要求高

我个人最常用的是多环振荡器+冯·诺依曼校正器。结构简单,数字工艺友好,通过FIPS 140-2测试没问题。

3.3.2 后处理与健康检测

原始熵源输出的比特流往往有偏置。需要后处理:

  • 冯·诺依曼校正器:把"01"和"10"映射为0和1,丢弃"00"和"11"
  • 哈希提取:用SHA-256或HMAC对原始比特做压缩
  • LFSR扰码:用线性反馈移位寄存器做白化

健康检测也很重要。我曾经遇到过一款芯片,TRNG在高温下输出全是0,但没有任何告警。从那以后,我每个TRNG设计都加三个检测:

  1. 运行检测:看输出是否在变化
  2. 偏置检测:统计0和1的比例
  3. 重复检测:看是否有长串的重复模式
避坑指南:TRNG的布局布线要特别注意。我曾经把TRNG放在一个高速数字模块旁边,结果电源噪声把熵源淹没了,随机数质量急剧下降。解决办法是:给TRNG独立的电源域,周围加保护环,远离时钟树和I/O。

3.4 本章知识体系

下面这张图把三种密码硬件的关系和设计要点串起来了:

密码学硬件实现知识体系 密码学硬件实现知识体系 AES硬件加速器 RSA/ECC协处理器 真随机数发生器 S-Box实现 密钥扩展 侧信道防护 Montgomery模乘 坐标系选择 CPU接口设计 熵源选择 后处理 健康检测 核心设计原则:面积-性能权衡 · 侧信道防护 · 可靠性设计 设计要点总结: • AES:全流水 vs 迭代架构选择,S-Box实现方式,掩码防护 • RSA/ECC:Montgomery模乘器设计,投影坐标优化,接口效率 • TRNG:多环振荡器熵源,冯·诺依曼校正,三合一健康检测 • 共性:布局布线隔离,电源域划分,综合属性保护

这张图把三种密码硬件的设计要点串起来了。你看,AES、RSA/ECC、TRNG虽然算法不同,但设计思路是相通的:架构选择要权衡面积和性能,防护措施要从RTL阶段就开始考虑,可靠性设计要贯穿前后端。

做密码硬件,说白了就是在数学、电路和安全之间找平衡。没有完美的设计,只有最适合场景的方案。我做了这么多年,每次流片回来还是会有新发现——嗯,这就是硬件设计的魅力所在。