密码学算法硬件实现基础

从软件到硬件:为什么需要硬件加速?

你做网络协议栈的时候,肯定见过软件跑TLS握手有多慢。尤其是RSA签名或ECDHE密钥协商,CPU在那吭哧吭哧算大数模幂,延迟能飙升几百微秒。说实话,在数据中心里这个时间足够丢好几个包了。

我入行第一年跟过一个硬件加速器项目。当时领导说:“把AES和SHA搬到FPGA上,延迟压到1微秒以内。”我心想怎么可能?后来才发现,硬件做对称加密和哈希,根本不需要循环几十轮——一条流水线下去,一个时钟周期出一块结果。嗯,从那以后我对“硬件加速”这四个字再也不敢小瞧。

AES硬件实现要点

AES核心是字节代换、行移位、列混合、轮密钥加。在硬件里,这四个操作都能并行化。

  • S盒查表:用BRAM或LUT实现256字节查找表。注意时序,关键路径常在S盒到MixColumns之间。
  • 轮函数流水:10轮(128位密钥)可以拆成10级流水,每级做一轮。代价是寄存器多,但吞吐量可以压到单周期一轮。
  • 密钥扩展:可以预计算所有轮密钥存下来,也可以在线生成。我习惯预计算,省逻辑但多费BRAM。

小技巧:AES-NI指令集其实跟硬件实现思路很像——把S盒固化到逻辑里,然后做快速查表。你在FPGA里也可以这么干,但要注意S盒的时序收敛。

我曾经做过一个128位AES-CBC引擎。最坑的是CBC模式不能流水,必须等上一块结果。后来改成CTR模式,一下子就跑满10Gbps了。所以模式选择比算法优化更重要。

RSA与模幂运算

RSA硬起来,其实就是算 a^b mod n。b最大可能是2048位,直接循环乘?那你延迟得爆炸。

方法硬件实现方式典型延迟 (2048位)
二进制指数扫描每次移位判0/1,做乘模~2k 周期
Montgomery模乘消除除法,用移位和加法替代~1k 周期
中国剩余定理(CRT)私钥拆成两个模幂,各一半位宽~500 周期

关键点:Montgomery模乘器是RSA引擎的核心。我调过一版2048位Montgomery,用了Karatsuba乘法,面积涨了30%但周期压到了600。值得。

顺便说个小坑:RSA公钥e通常很小(65537),所以加密快;私钥d很大,所以签名慢。硬件里你可以单独为私钥优化,比如CRT。我之前踩过雷——没有CRT,结果握手延迟飙到10ms,被客户骂惨了。

ECDHE与椭圆曲线运算

ECDHE比RSA快,是因为椭圆曲线上的点加和倍点运算都是有限域下的乘法和加法。硬件里,关键是两个模块:

  • 域运算器:处理素数域 GF(p) 或二进制域 GF(2^m)。P-256(256位)是常用的,域乘是最贵的。
  • 标量乘法:把私钥拆成bit,每次做倍点+点加。可以用Montgomery ladder防侧信道。

我见过一个设计,把域乘器做成48级流水线,每次域乘只要48周期。配合双域调度,一次标量乘法大概需要3000个周期。嗯,比RSA快一个数量级。

注意:ECDHE硬件容易漏掉“点验证”步骤。如果收到对方公钥不在曲线上,直接跑标量乘法会出安全漏洞。我记得有个标准强制要求验证,但有的实现偷懒了。

SHA系列与哈希

SHA-256/SHA-384在硬件里几乎是“白送”的。因为它全是移位、异或、与、非,没有乘法。关键路径在压缩函数里的加法器链。

SHA-256一轮需要64步,每步有几个加法。硬件里可以展开4步或8步,减少迭代次数。我做过一个SHA-256引擎,用4级流水,吞吐量轻松到10Gbps。面积才几千个LUT。

避坑指南:我曾经把一个SHA-256的轮常量存到BRAM里,结果发现时序不收敛。后来改成分布式ROM,解决了。对于小常量,最好用LUT而不是BRAM。

一张图看懂硬件密码引擎

下面这张图把上面讲的几个算法放到统一的硬件架构里。你会发现对称、哈希、公钥其实是三个不同路子,但共享一个控制总线和存储接口。

硬件密码引擎整体架构 控制总线 存储接口 (DMA/SRAM) AES核 SHA-256核 RSA模幂器 ECDHE点乘器 TRNG / PUF 密钥调度 / 存储 流水线寄存器 + 调度逻辑 (控制状态机、握手、中断) 共享资源:BRAM/LUT/RAM、乘法器、加法器、移位器 可配置:运算位宽、模式选择(ECB/CBC/GCM等)

看图就知道,其实每个核都是独立模块,数据和控制通过总线调度。你甚至可以把AES和SHA串起来做GCM模式——硬件里只需要加个乘法器和异或门。

好了,这章先到这。上面的内容都是我从项目里摔打出来的。下次要是面试官问你硬件密码实现,你可以把Montgomery模乘器和EC点乘说清楚,再举几个我这样的小坑,镇住场面。