密码学基础回顾:对称加密、非对称加密、哈希函数的硬件实现考量
各位好,我们直接进入正题。今天聊的是密码学三大件在硬件里的落地问题。说实话,软件里跑个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是S-Box的面积,RSA是大数乘法的宽度,ECC是曲线选择,SHA是流水线深度。说白了,没有银弹,只有权衡。
最后说一句:如果你刚开始做密码硬件,我建议先从AES入手。它结构规整,文档丰富,仿真验证也容易。等你把AES的流水线、时序、面积优化都摸透了,再碰RSA和ECC,会顺手很多。
公众号:蓝海资料掘金营,微信deep3321