为了账号安全,请及时绑定邮箱和手机立即绑定

告别RSA和ECDSA,迎接SPHINCS+(又称SLH-DSA)的新时代

较小的密钥,但较大的签名,没有使用哈希

有兩個經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页)。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消