继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

和 RSA、ECDSA、EdDSA 说再见,热烈欢迎 ML-DSA 的到来

三国纷争
关注TA
已关注
手记 419
粉丝 51
获赞 178

就在本周,Cloudflare 在他们的 CIRCL 库中发布了 ML-DSA 方法,并支持这种用于后量子密码学 (PQC) 的 Dilitium 数字签名方法。

这被定义为FIPS 204,(基于模块化晶格的数字签名标准——即ML-DSA)[here] :

我们可以这样添加签名方法:

模式 := schemes.ByName("ML-DSA-44")

将名为 "ML-DSA-44" 的模式赋值给变量 mode

这里提到的ML-DSA 方法有 ML-DSA-44(一级的安全性),ML-DSA-65(三级的安全性)和 ML-DSA-87(五级的安全性)。支持的方法如下:

代码可以在这里找到:[here]

    package main  

    import (  
     "fmt"  
     "os"  

     "github.com/cloudflare/circl/sign"  
     "github.com/cloudflare/circl/sign/schemes"  
    )  

    func main() {  
     modename := "Dilithium2" // Dilithium2-AES Dilithium3 Dilithium3-AES Dilithium5 Dilithium5-AES  

     m := "Hello"  

     argCount := len(os.Args[1:])  

     if argCount > 0 {  
      modename = os.Args[1]  
     }  

     if argCount > 1 {  
      m = os.Args[2]  
     }  

     mode := schemes.ByName(modename)  

     pk, sk, _ := mode.GenerateKey()  

     msg := []byte(m)  
     opts := &sign.SignatureOpts{}  
     signature := mode.Sign(sk, msg, opts)  

     fmt.Printf("PQC Signatures (Dilithium)\n\n")  
     fmt.Printf("Signature method: %s \n", modename)  
     s, _ := sk.MarshalBinary()  
     fmt.Printf("Private key: %x [showing first 32 bytes]\n", s[:32])  
     fmt.Printf(" - Private key length: %d\n", len(s))  
     p, _ := pk.MarshalBinary()  
     fmt.Printf("Public key: %x [showing first 32 bytes]\n", p[:32])  
     fmt.Printf(" - Public key length: %d\n", len(p))  

     fmt.Printf("Signature: %x [showing first 64 bytes]\n", signature[:64])  

     fmt.Printf(" - Signature length: %d \n", len(signature))  

     if !mode.Verify(pk, msg, signature, opts) {  
      panic("Signature has not been verified!")  
     } else {  
      fmt.Printf("Signature has been verified!")  
     }  

    }

总体上来说,Ed25519 和 Ed448 是基于椭圆曲线的签名方法,而 Ed25519-Dilithium2 和 Ed448-Dilithium3 则是混合了其他技术的方法。PQC 标准是通过 ML-DSA 技术定义的。

使用X25519,我们看到这样的密钥长度(公钥为32字节,签名长度为64字节)如下所示:[这里]:


    签名方法:Ed25519   
    私钥:4b77c826b8ad62ee7f61b25890725fd3b0b062926a90b01c8539ecad187f76f0 [显示前32个字节]  
     - 私钥的长度:64  
    公钥:dc5abd832845a1a6ce0c28175d15ad327dd9ecf3817344f8227f3c4b92c3d9ec [显示前32个字节]  
     - 公钥的长度:32  
    签名:b232982ca55ea59a684a5c862cd50123ff44cec8c05a533a356e99245df8b88a4f28319c237102692e36348991a2658f85c2842ce16bdcdce8bc945359bf500e [显示前32个字节]  
     - 签名的长度:64   
    签名已成功验证!

如果我们现在实施ML-DSA-44,我们可以在这里查看:[here]

    签名算法:ML-DSA-44   
    私钥:12668fc135b08dab2c18aecb1cfe3f79084ee669cd3155e1f489598e466df177 [前32字节]  
     - 私钥长度:2560  
    公钥:12668fc135b08dab2c18aecb1cfe3f79084ee669cd3155e1f489598e466df177 [前32字节]  
     - 公钥长度:1312  
    签名:e713a05891d40e0757f46d6de4bacd7f7942b53a60a96b261737747a4cfadbeae60fffbf8cf8154d206d615f713c38558c07585988c4539437e8ebb6f873edf8 [前32字节]  
     - 签名长度:2420   
    签名已验证成功!

其中较大的公钥长度为2,560字节,签名长度为2,420字节。对于ML-DSA-65,我们可以在此处找到相关信息:

    签名方法:ML-DSA-65   
    私钥:cace8eb524a352189203c89e9bea4e7d29d9497738b84a249c7acf055049017d [显示前32字符]  
     - 私钥长度:4032  
    公钥:9ef7a3e8da0b5f1c928e9b2e5a4e7d29d9497738b84a249c7acf055049017d [显示前32字符]  
     - 公钥长度:1952  
    签名:616be6702e57302160c37bbe91fd5c486c84bd7ee810b8d41f0c408aa19561dec2e5cc27fb8fe2f72be09358a29014ab8ee869bcc1d2fc00c670d448b2e3796b [显示前32字符]  
     - 签名位数:3309   
    签名已成功验证!

公钥大小为1,952字节,签名大小为3,309字节。关于ML-DSA-87 [这里链接]:

签名方法:ML-DSA-87
私钥:c486368827a33fb76e831e1c73f1900cf86070280c61f1643dee8f11ff036258 [显示前32个字节]
- 私钥长度:4896字节
公钥:c486368827a33fb76e831e1c73f1900cf86070280c61f1643dee8f11ff036258 [显示前32个字节]
- 公钥长度:2592字节
签名:4be05823cb3759a2983ee08056ef8c870fd37feba5a15d6fb3bd64bda7adf9cb6a2896d8524bf138da737c65c707811a33beb999d43bf30e783423aa7a9658d9 [显示前32个字节]
- 签名长度:4627字节
签名验证成功!

公钥占用2,592字节,数字签名占用4,627字节。

结论部分

没有借口可说。RSA、ECDSA 和 EdDSA 将很快被淘汰,取而代之的是 ML-DSA!代码在这里:例如:查看代码

基于Dilithium的数字签名使用CIRCL 目前,CRYSTALS(代数格的密码学套件)支持的两种抗量子机制有:Kyber用于…详情请参阅…
打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP