密码学基础回顾:对称加密、非对称加密、哈希函数的硬件实现考量

各位好,我们直接进入正题。今天聊的是密码学三大件在硬件里的落地问题。说实话,软件里跑个AES、算个SHA-256,调个库就完事了。但在芯片里,每一笔面积、每一毫瓦功耗、每一个时钟周期,都得精打细算。我这些年踩过的坑,大多都跟「算法很美,硬件很累」这个矛盾有关。

一、对称加密:AES的硬件加速器设计

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

1. 轮运算的展开策略

AES-128需要10轮运算。每一轮包含SubBytes、ShiftRows、MixColumns、AddRoundKey。

  • 全展开(Unrolled):10轮全部流水线化。吞吐率极高,每时钟周期出一个结果。但面积巨大,我见过一个全展开AES核吃掉20万门。
  • 迭代(Iterative):只实现一轮的硬件,反复用10次。面积小,但延迟高。
  • 部分展开:比如2轮或4轮展开。这是工程上最常见的折中方案。

我个人习惯:如果目标频率在500MHz以上,我会优先考虑部分展开+流水线寄存器插入。否则时序收敛会让你怀疑人生。

2. S-Box的实现:查表还是计算?

S-Box是AES里最吃面积的部分。有两种做法:

  • ROM查表:256字节的查找表,简单直接。但每个S-Box约占用1200个LUT(在FPGA上)。
  • 组合逻辑计算:基于有限域GF(2^8)的逆运算+仿射变换。面积可以压缩到600-800个LUT,但路径延迟更大。

避坑指南:我曾经在一个低功耗IoT芯片里,为了省面积用了组合逻辑S-Box。结果时序分析发现关键路径正好在S-Box的计算链上,最后不得不插入两级流水。嗯,面积没省下来,延迟还多了两拍。所以,面积和时序永远是trade-off

3. 密钥扩展的硬件实现

密钥扩展可以在线计算,也可以预计算并存储。在线计算省存储,但每轮要多花几个周期。预计算则相反。

我建议:如果芯片有足够的片上SRAM,预计算所有轮密钥。这样解密时可以直接用逆序的轮密钥,省去逆变换的麻烦。

二、非对称加密:RSA与ECC的硬件权衡

非对称加密在硬件里,说白了就是大数运算。RSA需要2048位甚至4096位的模幂运算,ECC则是在椭圆曲线上做标量乘法。

1. RSA:Montgomery模乘是核心

RSA的瓶颈在于模幂运算。而模幂运算的本质是多次模乘。Montgomery模乘算法是硬件实现的标准答案。

// Montgomery模乘的硬件友好伪代码
function montgomery_multiplication(A, B, N, n):
    T = 0
    for i from 0 to n-1:
        T = T + A[i] * B
        q = (T * N_inv) mod 2^w
        T = (T + q * N) >> w
    if T >= N:
        T = T - N
    return T

你看,这个算法里没有除法,只有乘法和移位。硬件实现非常友好。但要注意:操作数宽度。2048位的乘法器,面积是1024位的4倍。我见过有人用32位乘法器串行做,结果一个RSA签名要几十毫秒。

我曾经踩过的坑:在设计RSA加速器时,我一开始用了全并行的2048位乘法器。面积爆炸,后端布局布线直接崩溃。后来改成分块并行(比如4个512位乘法器并行),面积降了60%,性能只损失了15%。

2. ECC:曲线选择决定硬件复杂度

ECC的硬件实现比RSA灵活得多。关键参数是:

  • 素数域 vs 二进制域:二进制域(GF(2^m))的加法没有进位,硬件更简单。但素数域(GF(p))更通用,NIST P-256就是素数域。
  • 坐标系统:仿射坐标需要模逆运算,硬件开销大。雅可比坐标或混合坐标可以避免模逆,但需要更多乘法。
曲线类型 面积(等效门) 性能(签名/秒) 适用场景
P-256(素数域) ~50K门 ~1000 通用安全芯片
Curve25519 ~35K门 ~2000 高性能/低功耗
SM2(国密) ~55K门 ~800 国内合规场景

你想想看,Curve25519为什么面积小?因为它用了蒙哥马利阶梯,而且素数p=2^255-19,模约简非常快。说白了,选对曲线,硬件设计就成功了一半

三、哈希函数:SHA-2与SHA-3的硬件差异

哈希函数在硬件里主要用来做完整性校验和HMAC。SHA-2和SHA-3的设计哲学完全不同。

1. SHA-2:迭代结构的经典

SHA-256有64轮压缩函数。硬件实现时,核心是消息扩展状态更新

  • 消息扩展:从16个32位字扩展到64个。可以一次性算完存起来,也可以边算边用。
  • 状态更新:8个32位寄存器的循环移位和逻辑运算。

我建议:对于SHA-256,用全流水线实现。64轮全部展开,每时钟周期可以处理一个消息块。吞吐率能做到10Gbps以上。但面积大概要15-20万门。

2. SHA-3:海绵结构的魅力

SHA-3基于Keccak海绵结构。它的核心是置换函数,没有复杂的消息扩展。

硬件实现时,Keccak-f[1600]置换包含5个步骤:θ、ρ、π、χ、ι。其中χ步骤是非线性的,其他都是线性的。

我个人经验:SHA-3的硬件实现比SHA-2更规整。所有操作都是位运算,没有加法进位链。所以SHA-3的时序更容易收敛。我在一个28nm的项目里,SHA-3跑到了1.2GHz,而SHA-256只能跑到800MHz。

3. 哈希函数的侧信道防护

哈希函数本身对侧信道攻击不太敏感,因为它的输入是公开的。但如果是HMAC场景,密钥参与运算,就需要防护了。

  • 掩码(Masking):对中间值进行随机化。
  • 隐藏(Hiding):让功耗曲线尽量平坦。

嗯,这里要注意:SHA-3的χ步骤是非线性的,掩码实现比SHA-2的加法掩码复杂得多。我建议如果要做侧信道防护,优先考虑SHA-2。

四、知识体系总览

下面这张图,是我对本章核心逻辑的总结。你看一眼,心里就有数了。

密码学硬件实现知识体系 对称加密 (AES) 非对称加密 (RSA/ECC) 哈希函数 (SHA-2/3) 轮展开策略:全展开/迭代/部分展开 S-Box:ROM查表 vs 组合逻辑 密钥扩展:在线计算 vs 预存储 RSA:Montgomery模乘 ECC:曲线选择与坐标系统 面积-性能权衡:分块并行 SHA-2:迭代结构 + 消息扩展 SHA-3:海绵结构 + Keccak置换 侧信道防护:掩码与隐藏 核心设计原则 面积 vs 吞吐率 · 时序收敛 · 侧信道防护 · 算法与硬件的协同优化

这张图把三大密码算法的硬件实现要点串起来了。你仔细看,每个分支都有自己最头疼的问题。AES是S-Box的面积,RSA是大数乘法的宽度,ECC是曲线选择,SHA是流水线深度。说白了,没有银弹,只有权衡

最后说一句:如果你刚开始做密码硬件,我建议先从AES入手。它结构规整,文档丰富,仿真验证也容易。等你把AES的流水线、时序、面积优化都摸透了,再碰RSA和ECC,会顺手很多。


公众号:蓝海资料掘金营,微信deep3321