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 对照
| 维度 | Ed25519 | ECDSA |
|---|---|---|
| 标准 | RFC 8032 | FIPS 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 允许从同一随机种子派生出两类密钥,但用途必须分开使用,混用会破坏安全假设,也让密钥轮换变得复杂。