3. 参数集与安全级别

SLH-DSA 在 FIPS 205 中一共定义了 12 个参数集,它们由三个维度交叉组合而成:哈希函数族(SHA2 或 SHAKE)、安全级别(128/192/256 位)以及签名尺寸与速度的取舍(s 小签名、f 快签名)。理解这 12 个参数集的关键,不是死记名字,而是抓住四个核心参数 n、h、d、k 如何共同决定密钥大小、签名大小、签名速度与验证速度。

一、四个核心参数的含义

n 是哈希输出的字节数,也是所有哈希值、随机数、种子和签名的基本长度单位。它直接由安全级别决定:128 位级别取 n=16,192 位级别取 n=24,256 位级别取 n=32。因此 n 是“安全级别”在参数层面的直接体现,n 越大,所有哈希值越长,密钥和签名也越大。

h 是 Merkle 树的总高度,决定了一次性签名(WOTS+)密钥对的数量上限,即 2^h 个叶子。h 越大,可签名的消息数量越多,但树越高,认证路径越长,签名也越大。

d 是超树(hypertree)的层数,把总高度 h 拆成 d 层,每层高度为 h/d。d 越大,每层树越矮,签名时每层需要计算的认证路径越短,签名速度越快,但签名中需要包含每一层的认证路径,层数越多签名越大。因此 d 是“速度与签名大小”之间的调节旋钮。

k 是 FORS(Few-Time Signature)的树数量,每个 FORS 树高度为 a = log2(k),总共有 k × 2^a 个 FORS 叶子。k 越大,FORS 部分能承受的签名次数越多,但 FORS 签名中包含的认证路径也越多,签名随之增大。k 主要影响签名大小和签名时的计算量。

二、12 个参数集的命名与结构

参数集命名格式为 SLH-DSA-{哈希}-{安全级别}{变体}。例如 SLH-DSA-SHA2-128s 表示使用 SHA2、128 位安全级别、小签名变体;SLH-DSA-SHAKE-256f 表示使用 SHAKE、256 位安全级别、快签名变体。s 变体通过增大 h、减小 d 来压缩签名,代价是签名更慢;f 变体通过减小 h、增大 d 来加快签名,代价是签名更大。

SLH-DSA 12 个参数集:哈希族 × 安全级别 × 变体 SHA2 系列(6 个) SHAKE 系列(6 个) 128 位 192 位 256 位 SHA2-128s n=16 h=63 d=7 k=14 签名小 · 签名慢 SHA2-128f n=16 h=66 d=22 k=33 签名大 · 签名快 SHAKE-128s n=16 h=63 d=7 k=14 签名小 · 签名慢 SHAKE-128f n=16 h=66 d=22 k=33 签名大 · 签名快 SHA2-192s n=24 h=63 d=7 k=17 签名小 · 签名慢 SHA2-192f n=24 h=66 d=22 k=33 签名大 · 签名快 SHAKE-192s n=24 h=63 d=7 k=17 签名小 · 签名慢 SHAKE-192f n=24 h=66 d=22 k=33 签名大 · 签名快 SHA2-256s n=32 h=64 d=8 k=22 签名小 · 签名慢 SHA2-256f n=32 h=68 d=17 k=35 签名大 · 签名快 SHAKE-256s n=32 h=64 d=8 k=22 签名小 · 签名慢 SHAKE-256f n=32 h=68 d=17 k=35 签名大 · 签名快 s 变体:小签名、慢签名 f 变体:大签名、快签名 注:参数为 FIPS 205 标准值,n 单位字节

三、参数对密钥与签名大小的影响

公钥大小在所有参数集中都是 2n 字节,私钥为 4n 字节。因此 128 位级别公钥 32 字节、私钥 64 字节;192 位级别公钥 48 字节、私钥 96 字节;256 位级别公钥 64 字节、私钥 128 字节。密钥大小只由 n 决定,与 h、d、k 无关,这是 SLH-DSA 相对友好的地方。

签名大小则复杂得多,主要由 n、h、d、k 共同决定。签名由三部分组成:FORS 签名、超树各层认证路径、以及 WOTS+ 链末端值。FORS 部分约为 k(1+a)·n 字节,超树部分约为 (h/d)·d·n = h·n 字节,再加上每层 WOTS+ 的 d·n 字节。以 128s 为例,n=16、h=63、d=7、k=14,签名约 7856 字节;而 128f 的 n=16、h=66、d=22、k=33,签名约 17088 字节,几乎是 s 变体的两倍多。可见 f 变体用更大的签名换取更快的签名速度。

四、参数对签名与验证速度的影响

签名速度主要受 d 和 k 影响。d 越大,每层树越矮,每层需要计算的哈希链越短,签名越快;k 越大,FORS 树越多,FORS 签名计算量越大,签名越慢。f 变体正是通过增大 d、增大 k 来加速签名。验证速度则相对稳定,因为验证只需按认证路径逐层计算哈希,计算量与 h 和 d 成正比,但总体远小于签名计算量。因此 SLH-DSA 的验证通常比签名快一个数量级左右。

选择参数集时,先确定安全级别(n),再根据应用场景在 s 与 f 之间取舍:证书、固件签名等对签名大小敏感的场景选 s;TLS 握手、交互式协议等对签名延迟敏感的场景选 f。哈希族 SHA2 与 SHAKE 在安全强度上等价,主要看平台是否已有 SHAKE 硬件加速。

五、参数选择速查表

参数集nhdk公钥签名(约)签名速度验证速度
SHA2-128s166371432 B7856 B慢快
SHA2-128f1666223332 B17088 B快快
SHA2-192s246371748 B16224 B慢快
SHA2-192f2466223348 B35664 B快快
SHA2-256s326482264 B29792 B慢快
SHA2-256f3268173564 B49856 B快快

表中数据为 FIPS 205 标准参数下的理论值,实际实现中签名大小可能因编码方式略有差异。SHAKE 系列与对应 SHA2 系列参数完全一致,仅哈希函数不同,因此大小和速度特性相同。

六、工程选型建议

在工程落地时,建议按以下顺序决策:第一,确定安全级别,128 位适用于大多数通用场景,192 位用于中高安全需求,256 位用于长期或高价值场景;第二,判断签名大小是否受限,若受限则选 s 变体;第三,若签名延迟是瓶颈,则选 f 变体;第四,根据平台哈希加速能力选择 SHA2 或 SHAKE。例如在资源受限的 IoT 设备上,若只需少量签名且对大小敏感,可选 SHA2-128s;在服务器端 TLS 场景中,若握手延迟敏感,可选 SHAKE-128f 并利用 SHAKE 硬件指令加速。

不要为了“更安全”盲目选择 256 位参数集。256 位级别的签名和密钥都显著更大,签名计算量也更高,而 128 位级别在经典和量子模型下均已达到足够的安全裕度。除非有明确的合规或长期安全要求,否则 128 位或 192 位通常是更均衡的选择。

掌握这 12 个参数集的关键,是把 n、h、d、k 四个参数与“密钥大小、签名大小、签名速度、验证速度”四个指标建立映射关系。n 决定密钥和哈希值长度,h 决定可签名数量与认证路径长度,d 决定签名速度与签名大小的平衡,k 决定 FORS 部分的签名大小与计算量。理解这层映射,就能在具体工程中快速锁定合适的参数集,而不是在 12 个名字中盲目试错。