SLH-DSA(SPHINCS+,FIPS 205):算法详解
《应用后量子密码学》本章的全部代码:共 3 段,其中 3 段可在此运行。编辑任意单元格,然后点击运行。
书中的代码片段在一章之内层层相依,但 Sage Cell 内核每次只运行一个单元格,运行后不保留任何状态,因此每个单元格都会用 apqc_book 重放此前的代码。这一调用是在书中原有代码之外唯一添加的内容。
代码 1:SageMath 实验:带地址的 Merkle 认证
这个仅使用哈希的小例子检验 SLH-DSA 验证中把认证路径折叠回公开根的那一部分。它使用八个叶子和一个基于 SHA-256 的玩具版哈希;它不是 FORS、WOTS+ 或完整 SLH-DSA 的实现。
代码 2:一个完整的 SageMath 实现
上面的 Merkle 实验在一个要紧的方面是玩具版的:它使用了一个虚构的地址格式。配套文件 sage/fips205_slhdsa.sage 实现了真正的方案——FIPS 205 中全部二十五个编号算法,每个算法都是一个独立的函数,并标注了其算法编号,覆盖全部十二个获批的参数集。这意味着两个哈希族(SHA2 和 SHAKE)、全部三个安全级别、s 和 f 两种变体都包括在内,此外还有 WOTS+ 链、XMSS 树、超树、FORS、纯消息(pure)与预哈希(pre-hash)两种顶层算法,以及 32 字节的地址结构及其 22 字节的压缩形式。
f 参数集的端到端运行,以及 s 参数集(其签名需要数分钟)对照 NIST ACVP 签名的验证
地址是一个小类,携带标准表 1 中的各个成员函数,因此算法 9 的递归树遍历读起来与规范完全一致:
代码 3:一个完整的 SageMath 实现
超树于是不过是把这种树堆叠 d 层,每一层对其下一层的根签名: