4. 安全加密引擎:AES硬件加速器设计、RSA/ECC协处理器、国密SM2/SM3/SM4硬件实现

加密引擎,说白了就是芯片里的「锁匠铺子」。

我做了十几年芯片安全,最深的体会是:软件加密就像用纸糊的保险柜,看着挺像那么回事,一碰就碎。真正的硬件加密引擎,才是能扛住物理攻击的铁疙瘩。这一章,咱们就聊聊这些铁疙瘩怎么造。

4.1 AES硬件加速器:对称加密的扛把子

AES(高级加密标准)是目前最主流的对称加密算法。为什么需要硬件加速?因为软件跑AES太慢了,尤其是在需要高速加解密的场景下,比如SSD控制器、网络处理器。

我建议你记住一个数字:硬件AES引擎的吞吐量,通常是软件实现的10-100倍。这不是吹牛,是我在多个项目中实测出来的。

4.1.1 AES核心架构

AES硬件加速器的核心模块包括:

  • 密钥扩展单元:将初始密钥扩展为轮密钥
  • 轮运算单元:包含SubBytes、ShiftRows、MixColumns、AddRoundKey
  • 控制状态机:管理加密/解密流程

这里有个常见的坑——密钥扩展的时序。我曾经在一个项目中,为了省面积,把密钥扩展做成了串行计算,结果每次加解密都要等密钥扩展完,吞吐量直接腰斩。后来改成预计算+流水线,问题才解决。

关键设计点:AES-128需要10轮,AES-192需要12轮,AES-256需要14轮。轮数不同,控制状态机的设计也不同。

4.1.2 S-Box实现:面积与速度的博弈

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

实现方式 面积 速度 适用场景
查找表(LUT) 大(256×8 ROM) 快(1周期) 高性能场景
组合逻辑 小(约1/3) 慢(多周期) 面积敏感场景

我个人习惯的做法是:在关键路径上用LUT,非关键路径上用组合逻辑。比如,加密和解密可以共用一套S-Box,通过控制信号切换,能省不少面积。

小技巧:如果你用FPGA实现AES,直接用Block RAM做S-Box查找表,速度最快。ASIC的话,建议用综合工具自动优化。

4.1.3 流水线与反攻击设计

AES硬件加速器通常采用10级流水线结构,每轮一个流水级。这样每个时钟周期都能输出一个加密结果,吞吐量最大化。

但流水线有个问题——容易受到侧信道攻击。攻击者可以通过分析功耗曲线,推断出密钥。我曾经在一个项目中,客户要求通过FIPS 140-3认证,结果我们的AES引擎在功耗分析测试中挂了。

解决方案是加入掩码(Masking)技术

  • 在每一轮运算中,对中间结果进行随机掩码
  • 掩码值在每轮运算后更新
  • 最终输出时去除掩码

注意:掩码会增加约30%的面积开销,但这是通过安全认证的「入场券」。别想着省这个钱,否则流片回来发现过不了认证,哭都来不及。

4.2 RSA/ECC协处理器:非对称加密的硬骨头

非对称加密比对称加密复杂得多。RSA依赖大数模幂运算,ECC依赖椭圆曲线点乘运算。这些运算在软件里跑,慢得让人抓狂。

我做过一个RSA协处理器,2048位密钥的签名操作,软件需要几十毫秒,硬件只需要几百微秒。差距就是这么明显。

4.2.1 RSA核心:蒙哥马利模乘

RSA的核心运算是模幂运算,而模幂运算的核心又是模乘。最常用的硬件实现是蒙哥马利模乘算法

蒙哥马利模乘的优点是:避免了除法运算,只用乘法和加法。这在硬件里是天大的好事,因为除法器太占面积了。

// 蒙哥马利模乘的简化伪代码
function montgomery_mult(A, B, N):
    // A, B, N 都是 k 位宽
    T = 0
    for i = 0 to k-1:
        T = T + A[i] * B
        if T[0] == 1:
            T = T + N
        T = T >> 1
    if T >= N:
        T = T - N
    return T

嗯,这里要注意:蒙哥马利模乘要求输入输出都在蒙哥马利域中。所以需要额外的转换操作。我建议你把转换操作和模乘操作放在同一个流水线里,减少数据搬移的开销。

4.2.2 ECC核心:点乘与坐标系选择

ECC的点乘运算(kP)是核心。实现方式主要有:

  • 二进制展开法:简单但慢,容易受时间攻击
  • 蒙哥马利阶梯法:抗时间攻击,速度适中
  • 窗口法:速度快,但需要预计算

我个人推荐蒙哥马利阶梯法。为什么?因为它天然抗时间攻击,而且实现起来不复杂。我曾经在一个项目中用了窗口法,结果被安全审计发现存在时间泄露,不得不重做。

坐标系选择也很关键:

坐标系 点加运算 倍点运算 特点
仿射坐标 需要模逆 需要模逆 模逆太慢,不推荐
投影坐标 无模逆 无模逆 速度快,面积大
雅可比坐标 无模逆 无模逆 折中方案,常用

你想想看,模逆运算在硬件里有多慢?一个256位的模逆,可能需要几百个周期。所以尽量用投影坐标或雅可比坐标,避免模逆

经验之谈:ECC协处理器的面积通常比RSA小,但设计复杂度更高。如果你做物联网芯片,优先考虑ECC;如果是服务器芯片,RSA更合适。

4.3 国密SM2/SM3/SM4:中国标准,硬核实现

国密算法在国内是强制要求。SM2(公钥)、SM3(哈希)、SM4(对称)构成了完整的密码体系。

说实话,国密算法的硬件实现和AES/RSA/ECC有很多相似之处,但也有一些独特的坑。

4.3.1 SM4:类AES但不一样

SM4的结构和AES类似,都是SPN结构,但细节不同:

  • SM4的轮函数更复杂,包含非线性变换τ和线性变换L
  • SM4的密钥扩展和加密运算耦合更紧
  • SM4的S-Box是8×8的,和AES一样,但内容不同

我在实现SM4时,踩过一个坑:SM4的密钥扩展需要32轮,而加密只需要32轮。看起来一样,但密钥扩展的每一轮依赖前一轮的结果,没法并行。所以密钥扩展的延迟是32个周期,这个时间必须算进总延迟里。

// SM4密钥扩展核心逻辑
for i = 0 to 31:
    if i < 4:
        MK[i] = 密钥[i]
    else:
        MK[i] = MK[i-4] XOR F(MK[i-3], MK[i-2], MK[i-1], CK[i-4])

嗯,这里的F函数包含S-Box和线性变换,和加密轮函数类似。我建议复用加密轮函数中的S-Box和线性变换单元,能省不少面积。

4.3.2 SM3:哈希引擎的设计要点

SM3是国密哈希算法,输出256位摘要。硬件实现的关键是消息扩展和压缩函数

SM3的消息扩展需要生成132个32位字(W0-W67, W'0-W'63)。这个扩展过程是串行的,但可以用循环缓冲区来优化,避免大量寄存器。

压缩函数是SM3的核心,包含64轮迭代。每一轮都需要:

  • SS1、SS2的计算
  • TT1、TT2的计算
  • 状态更新(A-H寄存器)

我建议把压缩函数做成8级流水线,每级处理8轮。这样既能保证吞吐量,又不会太占面积。

优化技巧:SM3的布尔函数(FF、GG)可以用简单的逻辑门实现,别用查找表。我在一个项目中用查找表实现布尔函数,结果面积大了20%,速度还没提升。

4.3.3 SM2:国密公钥的硬骨头

SM2基于椭圆曲线,和ECC类似,但曲线参数不同。SM2的曲线是256位的素数域曲线。

SM2的硬件实现和ECC基本一致,但有几个特殊要求:

  • 密钥生成:需要真随机数发生器(TRNG)
  • 签名验证:需要模逆运算
  • 加密解密:需要KDF(密钥派生函数)

我曾经在一个项目中,SM2的签名验证速度不达标。排查后发现是模逆运算太慢。后来换用了扩展欧几里得算法的硬件实现,速度提升了3倍。

重要提醒:SM2的密钥对生成必须使用合格的TRNG。别用伪随机数生成器(PRNG),否则密钥空间会被大幅缩小,安全性形同虚设。

4.4 安全加密引擎的架构整合

在实际芯片中,AES、RSA/ECC、SM2/SM3/SM4通常不是独立存在的,而是整合成一个安全加密引擎(SEE)

下面是我设计的一个典型架构:

安全加密引擎(SEE)架构图 系统总线接口 主控制器(FSM) 对称加密引擎 AES-128/192/256 SM4 非对称加密引擎 RSA-1024/2048/4096 ECC/SM2 哈希引擎 SM3 SHA-256/384/512 密钥管理单元 真随机数发生器 总线接口 控制单元 对称加密 非对称加密 哈希 密钥管理 TRNG

这个架构的核心思想是:统一控制,模块独立。主控制器负责调度,各加密模块独立工作,通过内部总线交换数据。密钥管理单元负责密钥的存储和分发,TRNG提供随机数。

我建议在设计时,给每个加密模块加上独立的DMA接口。这样主CPU只需要下发命令,数据搬运由DMA完成,能大幅提升系统吞吐量。

总结一下:安全加密引擎的设计,说白了就是「算得快、藏得深、扛得住」。算得快靠流水线和并行架构,藏得深靠密钥管理和隔离设计,扛得住靠抗攻击技术。这三样缺一不可。

好了,这一章的内容就到这里。加密引擎的设计是个系统工程,需要平衡面积、速度、功耗和安全性。希望我的经验能帮你少走一些弯路。