文章讨论了在量子计算威胁下,如何将现有的公钥密码方法迁移到量子安全的密码方法。过渡方案是采用混合 PQC(Post-Quantum Cryptography),结合现有公钥密码算法和PQC算法的优点。文章还介绍了ML-DSA、SLH-DSA、ML-KEM、X25519等算法,以及X-Wing混合密钥封装机制。

我们需要将现有的公钥密码学方法迁移到量子安全的(quantum-robust)方法。但我们不能直接关闭互联网,然后一次性迁移它们。因此,近期和中期不会是纯粹的 PQC……很可能是混合 PQC,这样我们就能获得两全其美:当前公钥密码学方法的现有安全性,以及未来方法在面对大规模量子计算机构建时的安全性。
不管你喜不喜欢,我们的数字证书——在不久的将来——很可能包含两个公钥(一个经典公钥(例如 RSA),另一个是 PQC 公钥)。这些公钥随后将链接到给定的域名(例如 Alice.com):

对于组织来说,最有可能的公钥将是 ML-DSA(因为密钥大小合理,并且该方法具有良好的性能水平)。但是,根 CA(证书颁发机构)的签名者不太可能是 ML-DSA,因为人们对其长期安全性存在一些担忧。因此,由于根证书签名者的寿命可能长达十年或更长,因此我们可能会使用 SLH-DSA 进行根权限签名。由于中间 CA 通常分配证书的寿命以月为单位,因此中间 CA 可以接受使用 ML-DSA 进行签名。总体而言,SLH-DSA 是一种基于哈希的签名方法,比基于格的方法(如 ML-DSA 和 FN-DSA)更强大。
在密钥交换方面,我们不会直接转向 ML-KEM,因为这将允许更改网络堆栈。更可能的方法是以混合模式将 X25519 与 ML-KEM 集成,然后再与 ECDH 集成:

混合密钥交换
1976 年,我们看到了 Diffie-Hellman 方法的创建,该方法已发展到椭圆曲线 Diffie-Hellman (ECDH)。这通常使用 secp256r1 (P256) 曲线。另一种流行的曲线是 Curve 25519,它为我们提供了 X25519 密钥交换方法。
但是,由于 ECDH 基于离散对数问题,Shor 表明这些问题很容易用量子计算机破解。替代方案很可能是 Kyber,它已被 NIST 标准化为 FIPS 203。它有三个不同的安全级别:ML-KEM-512(128 位安全性)、ML-KEM-768(192 位安全性)和 ML-KEM-1024(256 位安全性)。总的来说,这是 KEM(密钥封装机制),它不是 Diffie-Hellman 方法,基本上是用 Alice 的公钥加密密钥:
按回车键或点击查看完整尺寸图片

人们对 ML-KEM-512 有点担心。因此,许多应用程序已迁移到 ML-KEM-768。那么,我们能否直接关闭 ECDH 并迁移到 ML-KEM-768?我们可以,但这意味着我们所有的服务器都需要在短时间内迁移。最好的方法是合并这两种方法以创建一种混合技术。
混合 KEM 的一个正在制定的标准是 [ 这里]:

目前的想法是连接为 ECDH 或 X25519 传递的两个计算出的共享密钥值和 ML-KEM 方法:
concatenated_shared_secret = shared_secret_1 || shared_secret_2
Bob 和 Alice 之间的共享密钥然后使用密钥派生函数(例如使用 HKDF)创建:
shared_key = KDF(shared_secret_1 || shared_secret_2)
总的来说,TLS 1.3 的建议方法显示了 X25519/secp256 和 Kyber 的合并:
按回车键或点击查看完整尺寸图片

2023 年,Google Chrome 集成了 X25519 和 Kyber768,它使用连接方法。目前,我们现有的密钥交换密钥大小为:
Type Public key size (B) Secret key size (B) Ciphertext size (B)
// 类型 公钥大小(字节) 私钥大小(字节) 密文大小(字节)
------------------------------------------------------------------------
P256_HKDF_SHA256 65 32 65
P384_HKDF_SHA384 97 48 97
P521_HKDF_SHA512 133 66 133
X25519_HKDF_SHA256 32 32 32
X448_HKDF_SHA512 56 56 56
但是,随着 ML-KEM 的兴起,这将增加。如果我们单独使用 ML-KEM-768 [ 这里]:

我们将密钥大小和密文增加到:
Length of Public Key (pk) = 1184 bytes
// 公钥长度(pk)= 1184 字节
Length of Secret Key (sk) = 2400 bytes
// 私钥长度(sk) = 2400 字节
Length of Cipher text (ct) = 1088 bytes
// 密文长度(ct)= 1088 字节
随着 X25519 的加入,我们通过 [ 这里] 增加了这个:
按回车键或点击查看完整尺寸图片

然后我们可以看到公钥还有另外 32 个字节,密文还有另外 32 个字节:
Length of Public Key (pk) = 1216 bytes
// 公钥长度(pk)= 1216 字节
Length of Secret Key (sk) = 2432 bytes
// 私钥长度(sk) = 2432 字节
Length of Cipher text (ct) = 1120 bytes
// 密文长度(ct)= 1120 字节
我们正在从 ECDH 密钥交换迁移到后量子方法。这涉及到密钥封装的使用,我们生成一个由公钥封装然后由关联的私钥解封装的密钥。虽然 ML-KEM 目前是首选方法,但我们很可能会使用一种混合方法,例如 ML-KEM768 和 X25519。X 翼是解决这个问题的一种方案,它经过优化,可以使用 X25519 和 ML-KEM-768 [1]。
总的来说,该论文表明,如果 X25519 或 ML-KEM-768 是安全的,那么 X 翼表现出优异的性能水平并且是安全的。X 翼和 X25519Kyber768 标准之间的主要区别是:
主要步骤是:
这可以说明为:

此示例的 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)
// 密钥的种子 %x\n\n
fmt.Printf("Seed for encapsulation %x\n\n", eseed)
// 封装的种子 %x\n\n
fmt.Printf("PK (first 100 bytes) %.200x (size=%d bytes)\n\n", pk,len(pk))
// PK(前 100 个字节)%.200x(大小=%d 字节)\n\n
fmt.Printf("SK %x (size=%d bytes)\n\n", sk,len(sk))
// SK %x (大小=%d 字节)\n\n
fmt.Printf("Cipher (first 100 bytes): %.200x (size=%d bytes)\n\n", ct,len(ct))
// 密码(前 100 个字节):%.200x(大小=%d 字节)\n\n
fmt.Printf("Shared secret (generated) %x\n\n", ss)
// 共享密钥(生成的)%x\n\n
fmt.Printf("Shared secret (decapsulated) %x\n\n", ss2)
// 共享密钥(解封的)%x\n\n
}
一个示例运行为:
Seed for keys 01be534852826206487104c8cb35f7cbee24e530ff12d29c527be7228f4abeca
Seed for encapsulation d2d769098488fe41844bd71252967b69f2a9fb975df71fde0da42f551d187acdca8c63027dc3da5d24fe1a65d116e7a0b49bd781ccc8fcb20b2f2b6bf4e0653d
PK (first 50 bytes) 7df702c59cb91363b055b75feea7799ff90551270263c6833ad6323a58654ad43a89033458a60b7944102caacd4c096c3873cbc986262f116305c99d21626232b764aaa1c56d5959a0d7a14a9566cb5884db99b720fccd19d0af4a4ba38a7b91ab644243 (size=1216 bytes)
SK 01be534852826206487104c8cb35f7cbee24e530ff12d29c527be7228f4abeca (size=32 bytes)
Shared secret (generated) 9022508492dd09f4e5f5e421a6c113d0a2ea43a15702576b2556d6fe14374d82
Shared secret (decapsulated) 9022508492dd09f4e5f5e421a6c113d0a2ea43a15702576b2556d6fe14374d82
在本例中,我们可以看到公钥长 1,216 字节,密文长 1,120 字节,私钥仅长 32 字节(因为它是生成私钥的种子值)。一旦种子值展开,它将具有一个 2,400 字节的 ML-KEM-768 私钥、一个 32 字节的 X25519 私钥和一个 32 字节的 X25519 公钥。在纯 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. Cryptology ePrint Archive. // [1] Barbosa, M., Connolly, D., Duarte, J. D., Kaiser, A., Schwabe, P., Varner, K., & Westerbaan, B. (2024)。X 翼:你一直在寻找的混合 kem。密码学电子印刷档案。
- 原文链接: billatnapier.medium.com/...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!