本文介绍了一种混合密钥封装机制X-Wing,它结合了X25519和ML-KEM-768,旨在实现后量子密码学的迁移。X-Wing优化了性能,并在X25519或ML-KEM-768任一安全的前提下保证整体安全。文章还展示了X-Wing与X25519Kyber768标准的主要区别,以及使用Golang实现的X-Wing密钥生成、封装和解封装过程。
我们正在从 ECDH 迁移到后量子方法。 这涉及到密钥封装的使用,我们生成一个密钥,该密钥被公钥封装,然后被相关的私钥解封装。 虽然 ML-KEM 目前是首选方法,但我们可能会使用混合方法,例如 ML-KEM768 和 X25519。
X-Wing 是解决此问题的一种方案,并且经过优化,可使用 X25519 和 ML-KEM-768 [ 这里][1]:
总的来说,该论文表明,如果 X25519 或 ML-KEM-768 是安全的,那么 X-Wing 表现出卓越的性能水平并且是安全的。 X-Wing 和 X25519Kyber768 标准之间的主要区别 [ 这里] 是:
目前,X-Wing 正在由 IETF 起草 [ 这里]:
主要步骤是:
sk,pk= ML-KEM-768.KeyGen_internal(z)
:从 32 字节的种子值 (z) 生成确定性的密钥对。
ss,ct = ML-KEM-768.Encaps(pk, w)
:使用公钥 (pk) 和种子 (w) 将密钥 (ss) 封装到密文 (ct) 中。 密文是确定性的。
ss2= ML-KEM-768.Decap(ct sk)
:使用私钥 (sk) 从密文 (ct) 中恢复共享密钥 (ss2)。
这可以用以下方式说明:
此示例的Golang 代码是 [ 这里]:
package main
import (
"fmt"
"math/rand"
"github.com/cloudflare/circl/kem/xwing"
)
func main() {
seed := make([]byte, 32)
rand.Read(seed)
sk, pk := xwing.DeriveKeyPairPacked(seed)
eseed := make([]byte, 64)
rand.Read(eseed)
ss, ct, _ :=xwing.Encapsulate(pk, eseed)
ss2 := xwing.Decapsulate(ct, sk)
fmt.Printf("Seed for keys %x\n\n", seed)
fmt.Printf("Seed for encapsulation %x\n\n", eseed)
fmt.Printf("PK (first 100 bytes) %.200x (size=%d bytes)\n\n", pk,len(pk))
fmt.Printf("SK %x (size=%d bytes)\n\n", sk,len(sk))
fmt.Printf("Cipher (first 100 bytes): %.200x (size=%d bytes)\n\n", ct,len(ct))
fmt.Printf("Shared secret (generated) %x\n\n", ss)
fmt.Printf("Shared secret (decapsulated) %x\n\n", ss2)
}
一个示例运行是 [ 这里]:
Seed for keys 443d6bf9fd37c9b3fbcb641206216662bbe188da987b87086e28e10f5899a1ee
Seed for encapsulation d429878feb6adbe4d20209c8dff8cb83ede58ef1b4c65ceb27a06d57baf8746a1faba4a85d020361e22956dc89251c6ed79b925618d89430122c55c97968d306
PK (first 100 bytes) 19dc2f25a48dd4f8520a97cbf0e48e805428a00364cbb63f06379a45
b53ba3b662029c8af5f12ba7a5bd68bb62971657cf33466ad295ca7557baf951486711e204c7
1e65622dc4761c5c723777c10b7051ed40bb6b23c46aea2a5f579e00938d1c2722268b2ee6847
14658b453b4bce7a844055c31ac962488445646bc91a67ac96c42ca304a70a719873836c2fe9
2422a2b564e1387cf622e51a1360f13c500c5c9bed92422627d7086462cc26a8d744dc330323
6549bb32a3ee0492a62d4239e73024ab8b3374b (size=1216 bytes)
SK 443d6bf9fd37c9b3fbcb641206216662bbe188da987b87086e28e10f5899a1ee (size=32 bytes)
Cipher (first 100 bytes): d0c62d70fc6e7ac9058edf6be7017df61a09d98146bee2f9469
76a45a3e7be57f4be5896139fd9ebb99cec7febad80ef4598297bd5a6b617a3aae07448e6083
e02820dcbcca0731ff5db2533894fe3629ad7642589eba33e5fe92535291d4c912230ff009d
f1c4442b16f3e8bc18bccb1f1baa23af3992a037d4aafb36a637653c7caf711eb09e33cfbbad
4633ffd3eb6f5b38b156d3a17615a371cf1d9607ef9fc5b7b624fc814636f88499230c1f9970
f4fbce0584b07680340d53c47ba922d18d69a2cf4338e9 (size=1120 bytes)
Shared secret (generated) 1be72faba7b4a6eea842d56e1d63229abdcb212b98defb46735a45aaaf81f4db
Shared secret (decapsulated) 1be72faba7b4a6eea842d56e1d63229abdcb212b98defb46735a45aaaf81f4db
在这种情况下,我们可以看到公钥 长 1,216 字节,密文 长 1,120 字节,私钥仅长 32 字节(因为它经过哈希处理)。 通常,在 ML-768 中,公钥长 1,184 字节,私钥长 2,400 字节,密文长 1,088 字节。 这些密钥大小在论文 [1] 中定义:
[1] Barbosa, M., Connolly, D., Duarte, J. D., Kaiser, A., Schwabe, P., Varner, K., & Westerbaan, B. (2024). X-wing: The hybrid kem you’ve been looking for. 密码学电子印刷档案。
- 原文链接: billatnapier.medium.com/...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!