密码学基础回顾:非对称加密体系、哈希函数与数字签名标准

做硬件加速这行,有个坎儿你绕不过去——密码学基础。我见过不少工程师,上来就撸 Verilog 实现 RSA 模幂,结果连公钥私钥怎么配对的都说不清楚。嗯,这不行。今天咱们把三个核心模块掰开揉碎讲清楚:非对称加密、哈希函数、数字签名标准。这些都是后面硬件加速的基石。

非对称加密体系:RSA 与 ECC

非对称加密,说白了就是两把钥匙——公钥公开,私钥自己藏好。你用它加密,我用它解密,中间人就算拿到公钥也白搭。

RSA:大数分解的硬骨头

RSA 的安全性建立在「大整数分解」这个数学难题上。给你两个大素数 p 和 q 的乘积 n,想反推出 p 和 q,计算量是指数级的。我当年做第一个 RSA 协处理器时,踩过一个坑:密钥生成时随机数质量不够,导致 p 和 q 的差值太小,被 Fermat 分解法秒破。嗯,从那以后我再也不敢用库函数默认的随机数生成器了。

RSA 的核心运算就两个:

  • 加密/验签:\( c = m^e \mod n \)(公钥指数 e 通常取 65537)
  • 解密/签名:\( m = c^d \mod n \)(私钥指数 d 保密)

硬件加速的重点就在模幂运算上。我建议你重点关注 Montgomery 模乘算法,它能避免除法,在硬件里特别好实现。

关键参数对比

参数 RSA-2048 RSA-4096
模数 n 长度 2048 bit 4096 bit
安全等级 112 bit 128 bit
签名速度(软件) ~2000 次/秒 ~500 次/秒
硬件加速后 ~50000 次/秒 ~15000 次/秒

ECC:椭圆曲线上的优雅

ECC 用更短的密钥达到同等安全强度。256 位的 ECC 密钥,安全性和 3072 位的 RSA 差不多。为什么?因为 ECC 依赖的是椭圆曲线离散对数问题(ECDLP),破解难度比大数分解高得多。

ECC 的签名算法主要有 ECDSA 和 SM2(国密标准)。我个人习惯在资源受限的场景优先选 ECC,比如物联网芯片、智能卡。你想想看,一个 256 位的点乘运算,硬件面积比 RSA 的 2048 位模幂小太多了。

我的经验:ECC 的标量乘法(kP)是硬件加速的核心。用 Montgomery 阶梯算法可以抵抗简单功耗分析(SPA),我在一个金融安全芯片项目里就用过,效果不错。

哈希函数:SHA-256 与 SM3

哈希函数把任意长度的消息压缩成固定长度的摘要。签名验签里,我们不会直接签原始消息,而是签它的哈希值。为什么?因为哈希运算快,而且能保证消息完整性。

SHA-256:国际标准

SHA-256 输出 256 位摘要,属于 SHA-2 家族。它的核心是 64 轮压缩函数,每轮用 6 个逻辑函数和 8 个工作寄存器。硬件实现时,我建议你注意两点:

  • 消息调度:16 个 32 位字扩展到 64 个,这个扩展逻辑可以流水线化
  • 加法器链:每轮有 4 个 32 位加法,用进位保存加法器(CSA)能减少关键路径

我曾经在一个项目里把 SHA-256 的吞吐做到 10 Gbps,秘诀就是展开 4 轮并行计算。当然,面积也翻了一倍——这就是典型的面积换速度。

SM3:国密标准

SM3 是中国国家密码管理局发布的哈希标准,输出也是 256 位。它的结构和 SHA-256 类似,但细节不同:

特性 SHA-256 SM3
消息分组 512 bit 512 bit
摘要长度 256 bit 256 bit
压缩轮数 64 64
逻辑函数 6 个 8 个(含置换函数 P₀/P₁)
硬件面积 基准 约 +15%

SM3 的置换函数 P₀ 和 P₁ 是它和 SHA-256 最大的区别。硬件实现时,这些置换其实就是异或和循环移位,组合逻辑就能搞定,不费什么资源。

注意:国密标准要求 SM3 必须通过国家密码管理局的认证。如果你的产品要进政府采购清单,千万别用开源库的「兼容实现」——我见过有人因为这个被驳回,重新流片损失惨重。

数字签名标准:PKCS#1 v1.5 与 PSS

有了非对称加密和哈希,怎么把它们组合成签名方案?这就是数字签名标准干的事。RSA 的签名标准主要有两个:PKCS#1 v1.5 和 PSS。

PKCS#1 v1.5:老当益壮

PKCS#1 v1.5 是最早的 RSA 签名标准,结构简单:

签名值 = (0x00 || 0x01 || PS || 0x00 || DigestInfo) ^ d mod n

其中 PS 是填充字节(全 0xFF),DigestInfo 包含哈希算法标识和摘要值。这个方案在硬件里实现特别快,因为填充逻辑就是简单的拼接和比较。

但是,v1.5 有个著名的攻击——Bleichenbacher 攻击。攻击者利用格式检查的漏洞,通过选择密文逐步恢复明文。嗯,这里要注意:如果你的硬件实现里对填充格式的检查太「宽容」,就可能被利用。我建议你在硬件里做严格的格式校验,不要偷懒只检查首尾字节。

PSS:概率签名方案

PSS(Probabilistic Signature Scheme)是 PKCS#1 v2.0 引入的,安全性有严格证明。它的结构复杂一些:

签名值 = (0x00 || maskedDB || salt || bc) ^ d mod n

其中 maskedDB 是经过掩码处理的哈希值,salt 是随机数,bc 是固定边界字节。PSS 引入了随机性,同样的消息每次签名结果都不同——这能防止某些选择消息攻击。

我个人习惯在新项目里优先用 PSS。虽然硬件实现比 v1.5 多 20% 左右的逻辑,但安全性提升是值得的。尤其是做金融、政务这类高安全场景,PSS 几乎是必选项。

签名方案对比

特性 PKCS#1 v1.5 PSS
随机性 无 有(salt)
安全证明 无 有(ROM 模型)
硬件面积 基准 +15%~25%
适用场景 兼容旧系统 新设计、高安全

知识体系总览

下面这张图把本章的核心脉络串起来了。你仔细看,从原始消息到最终签名,每一步都对应一个硬件加速模块。

签名验签知识体系结构图 签名验签知识体系结构 原始消息 哈希函数 SHA-256 / SM3 数字签名方案 PKCS#1 v1.5 / PSS 非对称加密体系 RSA / ECC 硬件加速重点 模幂运算 (RSA) 标量乘法 (ECC) 压缩函数 (哈希) 安全注意事项 侧信道攻击防护 随机数质量 格式校验严格

你看,从消息进来,先过哈希,再过签名方案,最后用非对称加密的私钥运算。硬件加速的切入点就在这三个模块里。哈希函数可以流水线并行,签名方案的填充逻辑可以硬连线,非对称加密的模幂/点乘可以用专用乘法器阵列加速。

我的建议:做硬件加速方案时,先搞清楚你的瓶颈在哪。如果是签名吞吐不够,优先优化非对称运算单元;如果是验签延迟太高,看看哈希和签名方案能不能合并流水线。我曾经在一个项目里把哈希和 PSS 的掩码生成合并成一个模块,省了 10% 的面积。

好了,密码学基础就回顾到这儿。这些概念后面会反复用到——尤其是做硬件架构设计时,每个模块的接口定义、时序约束、面积预算,都离不开今天讲的这些底层原理。