2、密码学基础:对称密码、非对称密码、哈希函数的基本原理与数学背景
密码算法是硬件加速设计的核心对象。无论是 AES、SM4、RSA、ECC 还是 SHA-256,其硬件架构的优劣直接取决于对算法数学结构的理解深度。本章从硬件实现视角出发,系统梳理三大类密码原语——对称密码、非对称密码与哈希函数——的数学原理、运算特征及硬件映射要点,为后续各章的流水线设计、并行调度和侧信道防护奠定基础。
2.1 对称密码:分组与流密码的数学内核
2.1.1 核心原理:从代换-置换网络到有限域
对称密码使用同一密钥完成加密与解密,其安全性建立在混淆(Confusion)与扩散(Diffusion)的交替运用之上。现代分组密码(如 AES、SM4)普遍采用 SPN(代换-置换网络)结构,每一轮由非线性代换层(S-box)和线性混合层(P-box / MixColumns)组成。从数学角度看,AES 的 S-box 本质上是 GF(2⁸) 上的乘法逆元映射加上仿射变换,而 MixColumns 则是 GF(2⁸) 上的矩阵乘法。这种有限域结构使得硬件实现可以选用查找表(LUT)或组合逻辑两种路径:LUT 适合 FPGA 的分布式 RAM,组合逻辑则更适合 ASIC 的低延迟设计。
流密码(如 ChaCha20)则基于 XOR 和模 2³² 加法,其核心是一个伪随机数生成器,将密钥扩展为密钥流,再与明文逐位异或。流密码的硬件优势在于:没有轮函数的状态寄存器依赖,可以做到极低的延迟和极高的吞吐,适合高速链路加密场景。
2.1.2 硬件实现判断方法:轮函数拆解与资源评估
在硬件设计初期,需要快速评估对称密码算法的实现代价。以下三个维度是核心判断依据:
- S-box 规模:AES 需要 16 个 8×8 S-box(每轮),若采用 LUT 实现,在 FPGA 上消耗约 16×256×8 bit = 32 Kbit 的分布式 RAM;若采用组合逻辑,则需评估逻辑级数和面积。
- 轮函数数据通路宽度:AES 的 128-bit 数据通路意味着每轮需要 16 个 S-box 并行,MixColumns 需要 4 个 32-bit 的 GF 乘法器。SM4 的 32-bit 通路则更紧凑,适合资源受限场景。
- 密钥扩展调度:AES-256 需要 60 轮密钥扩展,若采用在线计算,需额外 4 个 S-box;若预计算存储,则需 240 字节寄存器。硬件设计需在面积与时延之间权衡。
| 算法 | 分组/密钥长度 | 轮数 | 核心运算 | 硬件资源特征 |
|---|---|---|---|---|
| AES-128 | 128 / 128 bit | 10 | GF(2⁸) 逆元 + 仿射 | 16 S-box / 轮,适合全流水 |
| SM4 | 128 / 128 bit | 32 | 循环移位 + 异或 + S-box | 4 S-box / 轮,面积紧凑 |
| ChaCha20 | 512 / 256 bit | 20 | 模 2³² 加法 + 循环移位 | 无 S-box,纯算术逻辑 |
2.1.3 案例拆解:AES-128 加密引擎的硬件映射
假设需要设计一个面向物联网网关的 AES-128 加密引擎,目标吞吐 10 Gbps,工作时钟 200 MHz。数据通路宽度为 128 bit,则每周期需处理 128 bit,即每周期完成一轮加密。AES-128 共 10 轮,若采用全流水架构,需要 10 级流水线,每级包含 16 个 S-box、MixColumns 和密钥加。初始面积估算:16 S-box × 256×8 bit LUT ≈ 32 Kbit,加上 MixColumns 的 GF 乘法器(可用 XNOR 门实现),总逻辑约 40K LUT。若采用迭代架构(单轮复用),面积降至 4K LUT,但吞吐降至 1 Gbps。最终方案选择 4 级部分流水,平衡面积与吞吐,实际实现约 18K LUT,满足 10 Gbps 目标。
2.1.4 常见误区与总结
- 误区一:认为 S-box 只能用查找表。实际上,基于 GF(2⁸) 的复合域求逆(如 Canright 方法)可将 S-box 面积降低 40% 以上,适合 ASIC。
- 误区二:忽略密钥扩展的时序。在线密钥扩展会引入关键路径,建议在轮函数流水线中插入密钥调度寄存器组。
- 误区三:混淆 ECB 与 CBC 的并行性。ECB 可全并行,CBC 存在链式依赖,硬件设计需为 CBC 模式增加多级流水或采用流水线型 CBC 变体。
2.2 非对称密码:大整数与椭圆曲线数学
2.2.1 核心原理:单向陷门函数
非对称密码的安全性建立在数学难题之上:RSA 依赖大整数分解的困难性,ECC 依赖椭圆曲线离散对数问题。RSA 的核心运算是模幂运算 \( c = m^e \bmod n \),其中 \( n = p \cdot q \) 为大合数(2048-4096 bit)。模幂可分解为多次模乘,而模乘的核心是 Montgomery 约简算法,它将除法转换为移位和加法,极大提升了硬件效率。ECC 则在椭圆曲线群上定义点加与点倍运算,每个点运算需要多次模乘(典型为 8-16 次),因此 ECC 硬件的核心是高速模乘器阵列。
2.2.2 硬件实现判断方法:位宽与运算次数
非对称密码硬件设计的首要参数是操作数位宽。RSA-2048 需要 2048-bit 的乘法器,若直接实现,面积巨大。工程上通常采用以下策略:
- 分块乘法:将 2048-bit 乘法拆分为 32-bit × 32-bit 的乘加单元,通过循环累加完成,面积可控但延迟增加。
- Montgomery 流水线:将模乘的乘加与约简步骤流水化,每周期处理一个分块,吞吐可提升 5-10 倍。
- ECC 的 Jacobian 坐标:使用 Jacobian 投影坐标避免模逆运算(模逆在硬件中代价极高),将点加/点倍统一为模乘与模平方。
| 算法 | 操作数位宽 | 核心运算 | 典型延迟(周期) | 硬件资源 |
|---|---|---|---|---|
| RSA-2048 解密 | 2048 bit | 模幂(约 2048 次模乘) | ~2M(单核) | 1 个 32-bit 乘法器 + 控制逻辑 |
| RSA-2048 加密 | 2048 bit | 模幂(指数 65537) | ~17 次模乘 | 同上,但延迟极低 |
| ECC P-256 点乘 | 256 bit | 点加/点倍(约 384 次模乘) | ~50K(单核) | 1-4 个 256-bit 模乘器 |
2.2.3 案例拆解:ECC P-256 签名加速
某安全芯片需要支持 ECDSA P-256 签名,目标签名延迟小于 1 ms(时钟 400 MHz,即 400K 周期)。P-256 点乘需要约 384 次模乘,每次模乘约 100 周期(采用 32-bit 分块 Montgomery),总周期约 38K,加上模逆和签名计算,总延迟约 60K 周期,满足 1 ms 要求。若采用 4 个并行模乘器,点乘延迟可降至 15K 周期,但面积增加 3 倍。最终选择双模乘器架构,延迟 30K 周期,面积适中。关键优化点:使用预计算表存储 \( 2^iP \) 点,减少点倍次数约 20%。
2.2.4 常见误区与总结
- 误区一:直接实现大位宽乘法器。2048-bit 乘法器在 FPGA 上不可行,必须分块;在 ASIC 上面积和时序均不现实。
- 误区二:忽略侧信道风险。模幂的运算时间与密钥位相关,需采用 Montgomery 阶梯或盲化技术。
- 误区三:混淆 RSA 加密与解密性能。加密指数固定为 65537,仅需 17 次模乘;解密指数为私钥,需 2048 次,硬件设计应区分优化。
2.3 哈希函数:压缩与雪崩效应
2.3.1 核心原理:Merkle-Damgård 与海绵结构
哈希函数将任意长度消息压缩为固定长度摘要,其安全性要求包括抗原像、抗第二原像和抗碰撞。SHA-2 系列采用 Merkle-Damgård 结构,将消息分块(512 bit 或 1024 bit)后依次送入压缩函数,压缩函数内部包含 64-80 轮的非线性操作(如 \( \Sigma \) 函数、选择函数 \( Ch \) 和多数函数 \( Maj \))。SHA-3 采用海绵结构,通过 Keccak-f 置换(24 轮)实现吸收与挤压。从硬件角度看,哈希函数没有密钥,因此不存在密钥扩展逻辑,但压缩函数的轮函数包含大量循环移位和异或操作,非常适合流水线设计。
2.3.2 硬件实现判断方法:吞吐与面积权衡
哈希硬件设计的关键指标是吞吐率(Gbps)和功耗效率(Gbps/W)。SHA-256 的压缩函数每轮包含 64 次循环,每次循环需要 6 个 32-bit 加法器和多个循环移位。若采用全展开流水线(64 级),吞吐可达 20+ Gbps,但面积约 50K LUT。若采用迭代架构(单轮复用),面积降至 3K LUT,但吞吐仅 0.3 Gbps。工程上常采用 4-8 级部分流水,平衡面积与吞吐。SHA-3 的 Keccak-f 置换为 1600-bit 状态,每轮包含 5 个步骤(θ、ρ、π、χ、ι),其中 χ 步骤为非线性,其余为线性操作,硬件实现时可将 θ 步骤的列奇偶校验提前计算以缩短关键路径。
| 算法 | 消息块大小 | 轮数 | 状态大小 | 硬件特征 |
|---|---|---|---|---|
| SHA-256 | 512 bit | 64 | 256 bit(8×32) | 32-bit 加法器阵列,适合流水 |
| SHA-3-256 | 1088 bit(吸收) | 24 | 1600 bit(5×5×64) | 大状态寄存器,θ 步骤为瓶颈 |
| SM3 | 512 bit | 64 | 256 bit | 类似 SHA-256,但消息扩展不同 |
2.3.3 案例拆解:SHA-256 多引擎并行设计
某 SSD 控制器需要 SHA-256 校验,目标吞吐 50 Gbps,工作时钟 500 MHz。单个 SHA-256 核在 500 MHz 下全流水可达到约 8 Gbps(每周期处理 16 bit),因此需要 6-8 个并行核。每个核采用 8 级流水,面积约 8K LUT,总面积 64K LUT,在中等规模 FPGA 上可行。关键优化:消息填充模块可提前处理,避免阻塞流水线;多个核共享输入缓冲,通过轮询调度分配消息块。实测吞吐 52 Gbps,功耗 3.2 W,满足设计目标。
2.3.4 常见误区与总结
- 误区一:认为哈希函数不需要密钥就简单。实际上,SHA-256 的 64 轮展开后组合逻辑深度较大,时序收敛困难,需插入流水线寄存器。
- 误区二:忽略消息填充逻辑。填充(添加 0x80、长度编码)在高速设计中可能成为瓶颈,建议用独立状态机预计算。
- 误区三:混淆 SHA-1 与 SHA-256 的硬件结构。SHA-1 的 160-bit 状态和 80 轮与 SHA-256 不同,不能直接复用。
2.4 三类密码原语的硬件设计对比与选型
在实际硬件加速项目中,往往需要同时支持多种算法。下表从硬件设计角度对比三类原语的关键差异,帮助设计者快速做出架构决策。
| 对比维度 | 对称密码 | 非对称密码 | 哈希函数 |
|---|---|---|---|
| 数学复杂度 | 低(有限域运算) | 高(大整数/椭圆曲线) | 中(位运算与置换) |
| 数据通路宽度 | 128-256 bit | 256-4096 bit | 256-1600 bit |
| 典型延迟 | 10-100 周期 | 10K-2M 周期 | 64-80 周期 |
| 并行策略 | 轮级流水、多块并行 | 模乘器阵列、密钥预计算 | 消息块流水、多核并行 |
| 侧信道风险 | 功耗分析(S-box) | 时间分析(模幂) | 无密钥,风险低 |
| 硬件复用性 | S-box 可复用 | 模乘器可复用 | 轮函数可复用 |
在 SoC 级硬件加速器设计中,通常将三类算法集成在统一的密码引擎中,共享数据总线、存储器和控制逻辑。对称密码和哈希函数因数据通路宽度相近(128-256 bit),可共享部分算术单元;非对称密码则独立设计模乘器阵列,通过 AXI 总线与主处理器交互。设计时需注意:非对称密码的运算延迟远高于对称密码,应采用异步队列或中断机制避免阻塞。