X25519是2016年由互联网工程任务组(IETF)在RFC 7748中标准化的椭圆曲线Diffie-Hellman密钥交换算法,建立在丹尼尔·J·伯恩斯坦设计的Curve25519蒙哥马利曲线之上。它让通信双方在不安全的信道上协商出一个共享密钥,公钥和私钥各为32字节,提供约128位的安全强度。由于运算只依赖x坐标、便于实现恒定时间、速度快且参数公开,X25519已成为TLS 1.3、SSH、WireGuard等现代协议中最常用的密钥协商方法之一。
定义
X25519是一种基于椭圆曲线的Diffie-Hellman(ECDH)密钥交换算法,其底层曲线为Curve25519。它接收32字节的私钥标量和对方32字节的公钥,通过标量乘法输出32字节的共享密钥,因此公私钥长度均为32字节。[1]
作为一项互联网标准,X25519由RFC 7748规范定义,该文档同时给出Curve25519的曲线参数和X25519函数的计算方式。RFC 7748第5节描述X25519这一Diffie-Hellman原语本身,第6.1节描述它在ECDH协议中的预期用法。[2] 原始文献中,名称「Curve25519」既指曲线也指这套密钥交换方案,后来伯恩斯坦建议用X25519专指密钥交换函数,用Curve25519专指曲线本身。[3]
原理
Curve25519是一条定义在素数域上的蒙哥马利曲线,其方程为 $y^2 = x^3 + 486662x^2 + x$,模数取素数 $p = 2^{255} - 19$,基点取 $x = 9$。[1] 曲线名称即来自这个素数:255 表示域的位数,19 表示所减去的常数。[4] 这类蒙哥马利曲线可以只用x坐标完成点的加法与倍点运算,无需处理y坐标和无穷远点,实现更为简洁。[5]
算法核心是一个标量乘法函数,输入两段各32字节的数据:一段按小端序解释为256位整数n,另一段按小端序解释为曲线上某个点的x坐标。[6] 计算前要对标量做「钳位」处理:把第0、1、2位和第255位清零,并把第254位置1,使标量落在 $2^{254} + 8k$($0 \le k \le 2^{251}-1$)这一子集中,即成为8的倍数,从而抵御小子群攻击。[7]
标量乘法采用蒙哥马利阶梯算法,逐位处理标量,无论该位是0还是1都执行相同的运算序列,因而天然接近恒定时间实现,不易因分支或访存差异泄露私钥信息。[8] 双方各自生成随机标量并计算公钥,交换公钥后各自用自己的私钥与对方公钥做标量乘法,得到相同的共享秘密。[6] 该共享密钥不应直接用作密钥,需再经过密钥派生函数处理,并把双方的公钥一并作为输入。[1]
发展历程
Curve25519由丹尼尔·J·伯恩斯坦提出,2006年他发表《Curve25519: new Diffie-Hellman speed records》一文,将其作为对NIST P系列曲线的替代方案,采用蒙哥马利形式以便高效、安全且易于实现。[3] 关于其提出年份,也有文献记为2005年发表。[9]
2016年1月,IETF正式将Curve25519用于密钥交换的方案写入RFC 7748,命名为X25519密钥交换协议,同一文档还收录了安全强度更高的Curve448。[10] IETF在通过该文档前,围绕这两条曲线与NIST曲线方案有过长期讨论。[11] RFC 7748通过之前,Curve25519的部署已经领先于标准化,早在2014年OpenSSH就开始采用相关的curve25519-sha256密钥交换方法。[4]
此后X25519被更多协议接纳。SSH在RFC 8731中规定了使用Curve25519和Curve448进行密钥交换的方法。[12] Java在JEP 324中把RFC 7748定义的密钥协商纳入标准库,以X25519和X448作为算法名称。[8] 随着后量子密码迁移推进,X25519还与ML-KEM组合成混合密钥交换,如TLS中的X25519MLKEM768。[13]
应用
在TLS 1.3中,为保证前向安全性,协议移除了静态RSA公钥加密的密钥交换方式,只保留Diffie-Hellman类密钥协商,并引入了X25519/X448;相比有限域DH和基于NIST P曲线的ECDH,X25519的计算量更小、参数选取过程公开。[14] 该算法也是TLS 1.3规定必须支持的密钥交换群之一。[4]
除了传输层安全协议,X25519还广泛用于远程登录与虚拟专用网络等场景。OpenSSH自2014年起把curve25519-sha256作为默认密钥交换方法;[4] SSH的相应方法由RFC 8731规定,公开值以32字节字符串编码。[12] WireGuard在握手阶段使用X25519派生会话密钥。[9] Signal、Noise协议框架等也以Curve25519为主要实例。[9]
在库与实现层面,X25519已被OpenSSL、BoringSSL、BouncyCastle等主流密码库支持。[8] 苹果的iOS设备、GnuPG和OpenSSH等都曾较早使用Curve25519完成密码学运算。[11] 为应对性能瓶颈,研究者还尝试在GPU等平台上加速X25519的点乘运算。[10]
局限
X25519本身不提供身份认证,只是一次未经认证的密钥交换,因此无法抵御主动攻击者发起的中间人攻击,需要借助签名、证书或预共享密钥等外部手段完成身份绑定。[15] 协议与实现层面的安全性依赖外部机制的配合,该原语本身不解决认证问题。
X25519的抗量子能力有限。与其他椭圆曲线密码一样,在足够大的容错量子计算机上,Shor算法可在多项式时间内求解椭圆曲线离散对数问题,从而攻破X25519。[16] Curve25519自身也受到Shor算法的威胁。[4] 由此产生的迁移思路是把X25519与ML-KEM等后量子算法组合为混合密钥交换,攻击者必须同时攻破两者才能恢复密钥,以应对先收集后解密的长期风险。[17]
在使用方式上,X25519的输出不能直接作为对称密钥使用,必须经过密钥派生函数,并把双方的公钥一同作为输入。[1] 它只处理x坐标,不涉及y坐标运算,与基于扭曲爱德华兹曲线的Ed25519虽然数学上相关,但密钥与用途并不通用。[4] 此外,X25519提供的约为128位安全强度,与Curve448的高强度层级不同,而后者较慢且密钥更大。[12]
参见
-
Curve25519 —— X25519所依托的蒙哥马利形式椭圆曲线,名称来自其素数域 $2^{255}-19$。
-
Curve448 —— 与Curve25519一同被RFC 7748收录、安全强度更高的曲线,对应密钥交换函数X448。
-
Ed25519 —— 与Curve25519双有理等价的扭曲爱德华兹曲线上的数字签名方案,常与X25519配套使用。
-
Diffie-Hellman密钥交换 —— X25519所属的密钥协商协议家族,用于在不安全信道上建立共享密钥。
-
TLS 1.3 —— 将X25519列为主要密钥交换群的传输层安全协议版本。
-
ML-KEM —— 后量子密钥封装机制,常与X25519组合成混合密钥交换以应对量子计算威胁。
参考资料
- X25519(3)# [引用日期2026-10-14]
- man [引用日期2026-10-14]
- s10623-015-0087-1(PDF) [引用日期2026-10-14]
- Curve25519: Why It Is Everywhere [引用日期2026-10-14]
- git.samba.org - gd/nettle/blobdiff [引用日期2026-10-14]
- 1tzsotsq8eI [引用日期2026-10-14]
- arxiv.org 上的网页 [引用日期2026-10-14]
- JEP 324: Key Agreement with Curve25519 and Curve448 [引用日期2026-10-14]
- Curve25519 [引用日期2026-10-14]
- abstract6443 [引用日期2026-10-14]
- heise.de 上的网页 [引用日期2026-10-14]
- rfc-editor.org 上的网页 [引用日期2026-10-14]
- Post-quantum cryptography (PQC) · Cloudflare SSL/TLS docs [引用日期2026-10-14]
- 信息安全学报 [引用日期2026-10-14]
- Module x25519 Copy item path [引用日期2026-10-14]
- Is ECDH Quantum Safe? | Qtonic Quantum [引用日期2026-10-14]
- 09-post-quantum-crypto [引用日期2026-10-14]