加密算法基础95 条

Ed25519 签名

RFC 8032 定义的 EdDSA 方案:在 edwards25519 曲线上运行,签名确定性生成(不依赖随机数)、公钥 32 字节、签名 64 字节,性能与易用性突出。

加密与证书速查安全更新于 2026-10-13

Ed25519 是什么

Ed25519 是 RFC 8032 定义的 EdDSA 签名方案,运行在 edwards25519 曲线上:私钥 32 字节、公钥 32 字节、签名固定 64 字节。它的签名过程是确定性的,不依赖每次签名的随机数,因此规避了 ECDSA 因随机数复用导致私钥泄漏的经典风险;实现简洁、速度快,广泛用于 SSH 登录与软件更新签名。

基本信息

标准RFC 8032
曲线edwards25519(约 128 位强度)
公钥 / 签名32 字节 / 64 字节(固定长度)
随机数依赖无,签名确定性生成
典型用途SSH 登录密钥、软件与固件更新签名、TLS 证书(逐步普及)
OpenSSL 支持1.1.1 起支持,使用 pkeyutl 的 -rawin 方式
配对算法密钥协商用 X25519,两者用途不可互换

典型使用场景

  • SSH 登录:ssh-keygen -t ed25519 生成密钥,比 RSA 更短更快
  • 软件更新签名:签名固定 64 字节,便于放进固件与引导程序
  • 容器与镜像签名:签名与公钥体积小,适合自动化流水线
  • 代码提交与发布物签名:配合 Git 的 SSH 签名或多方签名流程
  • 设备身份:资源受限设备上签名开销低于 RSA 与 ECDSA

生成与签名(OpenSSL)

生成与签名(OpenSSL)
# 生成 Ed25519 密钥对,私钥与公钥都是 32 字节
openssl genpkey -algorithm ED25519 -out ed.key
openssl pkey -in ed.key -pubout -out ed.pub
# 签名:Ed25519 内部自带哈希,不接受 -sha256 之类的摘要参数
openssl pkeyutl -sign -inkey ed.key -rawin -in data.bin -out sig.bin
# 验签:签名固定 64 字节,长度不符说明文件被截断或格式不对
openssl pkeyutl -verify -pubin -inkey ed.pub -rawin -in data.bin -sigfile sig.bin
# 生成 SSH 用的 Ed25519 密钥
ssh-keygen -t ed25519 -C 'ops@example.com'

与 ECDSA 对照

维度Ed25519ECDSA
标准RFC 8032FIPS 186-5 / SEC 1
随机数依赖无(确定性)需要唯一不可预测的 k
签名长度固定 64 字节DER 编码约 70-72 字节且可变
曲线选择固定一条曲线P-256/P-384/P-521 等多选
密钥协商不可用,需配 X25519不可用,需配 ECDH
适用场景新系统默认选择兼容既有证书与硬件体系
OpenSSL 对 Ed25519 使用 pkeyutl 的 -rawin 一次性处理整个输入,不支持流式多段签名。处理大文件时应先分块或用哈希方式另行约定,而不要期待它像 dgst 那样支持增量输入。
Ed25519 密钥只能签名,不能加密,密钥协商也需要换成 X25519。虽然 RFC 8410 允许从同一随机种子派生出两类密钥,但用途必须分开使用,混用会破坏安全假设,也让密钥轮换变得复杂。

易错点

  • 给 Ed25519 传摘要参数:用 -sha256 等参数签名会直接报错,Ed25519 内部已包含哈希步骤
  • 把 Ed25519 密钥当加密或密钥协商使用:算法不提供该能力,必须换 X25519 并另发密钥
  • 假设签名 DER 编码:Ed25519 签名是固定 64 字节的原始结构,按 DER 解析会失败
  • 用 dgst 处理大文件:OpenSSL 的 Ed25519 路径不支持流式签名,需要按约定先做分块或哈希
  • 混用 RSA 与 Ed25519 的 SSH 密钥配置:老服务端或老客户端可能不支持 Ed25519,需确认后再替换

数据来源与参考

  • RFC 8032(EdDSA)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌