就在本周,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用于…详情请参阅…