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)上的逆运算+仿射变换实现。面积小,但关键路径长。
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'
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
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设计都加三个检测:
- 运行检测:看输出是否在变化
- 偏置检测:统计0和1的比例
- 重复检测:看是否有长串的重复模式
3.4 本章知识体系
下面这张图把三种密码硬件的关系和设计要点串起来了:
这张图把三种密码硬件的设计要点串起来了。你看,AES、RSA/ECC、TRNG虽然算法不同,但设计思路是相通的:架构选择要权衡面积和性能,防护措施要从RTL阶段就开始考虑,可靠性设计要贯穿前后端。
做密码硬件,说白了就是在数学、电路和安全之间找平衡。没有完美的设计,只有最适合场景的方案。我做了这么多年,每次流片回来还是会有新发现——嗯,这就是硬件设计的魅力所在。