有兩個經NIST認可的后量子密码学 (PQC)數字签名替代方案。一個使用“心爱的”晶格方法(Dilithium),另一個則使用古老的基于哈希的签名(SPHINCS+)。然而,有些人擔心晶格方法中的基于学习的误差(LWE)可能在未来某个时刻被破解,因此NIST希望有其他替代方案,而从安全性角度来看,最安全的一种是基于哈希的签名。接下来,让我们来了解一下强大的SLH-DSA(也称为SPHINCS+)方法。
引言好吧,网络安全的缩写已经够多了,现在又多了几个。比如RIP、OSPF、TCP、IP、SSH、AES等等。现在,有特别重要的三个需要记住:ML-KEM(基于晶格的模块化密钥封装机制)、ML-DSA(基于晶格的模块化数字签名标准)和 SLH-DSA(无状态哈希基数字签名标准)。ML-KEM在FIPS 203标准中定义,ML-DSA是FIPS 204,而SLH-DSA则在FIPS 205标准中定义。
许多人会将ML-KEM认作CRYSTALS-Kyber,将ML-DSA认作CRYSTALS Dilithium,而将SLH-DSA认作SPHINCS+方法。因此,在2024年8月13日,FIPS 204正式出台[这里]:
而且,在同一天,美国国家标准与技术研究院(NIST)发布了FIPS 205 [此處連結]:
还有,FIPS 203 [这里]:
目前来看,我们密钥交换方法的唯一替代方案是 ML-KEM:数字签名的替代方案有两个,比如 RSA、ECDSA 和 EdDSA,分别为 ML-DSA 和 SLH-DSA。ML-KEM 和 ML-DSA 基于格理论,而 SLH-DSA 则采用无状态的哈希签名机制。
SLH-DSA有了这些,我们拥有了多个私钥,并可以在Merkle树中哈希它们,从而生成根公钥的签名。这种方法的缺点是,我们不能重复使用这些私钥,因为我们已经展示了它是如何到达根公钥的。为此,SPHINCS+将这种方法变为无状态的,并使用哈希树结构。
SPHINCS+ 是 NIST PQC(后量子密码学)标准的获胜者之一,由 Bernstein 等人在 2015 年提出并在 [2] 中更新。SPHINCS+ 256 128-bit,这是一个具体的实现,公钥大小为 32 字节,私钥大小为 64 字节,签名大小为 17KB,大约是 17000 字节。它已被 NIST 标准化为 FIPS 205,并可与 SHA-256 或 SHAKE-256 一起使用。这包括两种实现:SLH-DSA-SHAKE-128f 和 SLH-DSA-SHA2–128f。
以下是对数字签名的PCQ方法的分析:
算法 公钥大小(位) 私钥大小(位) 签名大小(位) 安全等级
------------------------------------------------------------------------------------------------------
RSA-2048 256 256 256
ECC 256位 64 32 256
Crystals Dilithium 2 1312 2528 2420 1 (128位) 晶格
Crystals Dilithium 3 1952 4000 3293 3 (192位) 晶格
Crystals Dilithium 5 2592 4864 4595 5 (256位) 晶格
SLH-DSA-SHA2-128f 32 64 17088 1 (128位) 基于哈希的
SLH-DSA-SHA2-192f 48 96 35664 3 (192位) 基于哈希的
SLH-DSA-SHA2-256f 64 128 49856 5 (256位) 基于哈希的
比如说,我们可以看到,公钥和私钥都很小。比如在SLH-DSA-SHA2-128f中,公钥长度仅为32字节,私钥长度则为64字节。相比之下,这比Dilithium(ML-DSA-512)要小很多。但是,数字签名则要大很多,达到17,088字节,而等效的Dilithium签名仅有2,420字节。
在 ARM Cortex-M4 器件上栈内存的大小(以字节来表示):
方法名称 密钥生成 签名 验证
----------------------------------------------------------------
Crystals Dilithium 2 (晶体双力) 36,424 字节 61,312 字节 40,664 字节
Crystals Dilithium 3 50,752 字节 81,792 字节 55,000 字节
Crystals Dilithium 5 67,136 字节 104,408 字节 71,472 字节
Falcon 512 (猎鹰) 1,680 字节 2,484 字节 512 字节
Falcon 1024 1,680 字节 2,452 字节 512 字节
SLH-DSA-SHA2-128f 2,192 字节 2,248 字节 2,544 字节
SLH-DSA-SHA2-192f 3,512 字节 3,640 字节 3,872 字节
SLH-DSA-SHA2-256f 5,600 字节 5,560 字节 5,184 字节
对于ARM Cortex-M4微控制器上的代码大小,以字节为单位。请注意,在[1]中没有进行Rainbow评估,因此使用了LUOV(一种油醋签名方法)来提供性能水平的参考。
方法 内存(字节)
-------------------------------------------------
Crystals Dilithium 2 (晶格), 13,948
Crystals Dilithium 3, 13,756
Crystals Dilithium 5, 13,852
Falcon 512 (晶格), 117,271
Falcon 1024, 157,207
Sphincs SHA256-128f Simple, 4,668
Sphincs SHA256-192f Simple, 4,676
Sphincs SHA256-256f Simple, 5,084
在性能方面,它在密钥生成、签名和验证的速度上都比 ML-DSA(Dilithium)慢得多 [here]:
总体来说,Haraka 哈希方法是最快的,但尚未被批准为 FIPS 标准。两个主要标准使用 NIST 批准的 SHA2 和 SHAKE 哈希。主要有两种主要的签名方式:一种是“纯”版本(slh_sign),另一种是“预哈希”版本(hash_slh_sign)。在签名前先对消息进行哈希处理。这意味着签名处理的数据较少,从而可以减轻签名应用程序的计算压力。
代码我们可以通过[这里]来安装SHLDSA
在终端里输入:pip install slh-dsa
这段代码的实现链接可以在这里找到:[这里]:
from slhdsa import KeyPair, sha2_128s, sha2_128f, sha2_192s, sha2_192f, sha2_256s, sha2_256f, shake_128s, shake_128f, shake_192s, shake_192f, shake_256s, shake_256f, PublicKey
import binascii
import sys
para = shake_256f
message = 'Hello'
method = 'sha2_128s'
if (len(sys.argv) > 1):
message = str(sys.argv[1])
if (len(sys.argv) > 2):
method = str(sys.argv[2])
if (method == 'sha2_128s'): para = sha2_128s
elif (method == 'sha2_128f'): para = sha2_128f
elif (method == 'sha2_192s'): para = sha2_192s
elif (method == 'sha2_192f'): para = sha2_192f
elif (method == 'sha2_256s'): para = sha2_256s
elif (method == 'sha2_256f'): para = sha2_256f
elif (method == 'shake_128s'): para = shake_128s
elif (method == 'shake_128f'): para = shake_128f
elif (method == 'shake_192s'): para = shake_192s
elif (method == 'shake_192f'): para = shake_192f
elif (method == 'shake_256s'): para = shake_256s
elif (method == 'shake_256f'): para = shake_256f
kp = KeyPair.gen(para)
sig = kp.sign(message.encode())
rtn = kp.verify(message.encode(), sig)
print(f"信息: {message}")
print(f"方法: {method}\n")
rtn = kp.verify(b"错误信息", sig)
print("\n错误签名有效: ", rtn)
print("签名(前32个字节的哈希): ", binascii.hexlify(sig[:32]))
print(f"签名长度: {len(sig)} 字节")
print("签名有效: ", rtn)
print("私钥大小: ", len(kp.sec.key[0] * 2))
print("公钥大小: ", len(kp.pub.key[0]))
使用 SHA2-128f 进行的示例运行结果显示如下 [这里]:
消息:后量子加密
方法:sha2_128f
私钥大小:32
公钥大小:16
签名(前32个字节):b'b1ecc5b25c8ee52ba0d42de7684e56c544e2ec64ae42f93be654d98f6925c918'
签名长度:17088字节
签名有效:有效
无效签名有效:无效
一次使用SHA2–256f的样本运行结果如下:[这里]:
消息:后量子密码学
方法:sha2_256f
私钥长度:64
公钥长度:32
签名(前32字节):b'1d18751a62751584e4f93e52f31f5f2c7033ae77936a5f405a18c722fd792db8'
签名长度:49856B
签名有效:True
错误签名有效:False
结论:
SLH-DSA 是一种具有小密钥的强大签名方案,但其签名比 RSA、ECDSA 和 ML-DSA 更长。它还具有无可挑剔的安全性保障,而 RSA、ECDSA 和 ML-DSA 则没有如此严谨的安全性保障。因此,作为 ML-DSA 的替代方案,它是一个极佳的选择。虽然在某些地方略显缓慢,但其安全性非常高。
参考资料[1] Kannwischer, M. J., Rijneveld, J., Schwabe, P., & Stoffelen, K. (2019). pqm4: NIST PQC 在 ARM Cortex-M4 上的测试及基准 [这里].
[2] Bernstein, D. J., Hülsing, A., Kölbl, S., Niederhagen, R., Rijneveld, J., & Schwabe, P. (2019, November). SPHINCS+签名框架论文。在2019 ACM SIGSAC计算机与通信安全会议论文集中(第2129-2146页)。
共同学习,写下你的评论
评论加载中...
作者其他优质文章