编码加密 · 非对称加密

Ed25519 密钥

现代 EdDSA 密钥对

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 53 次使用
Ed25519 · 现代 EdDSA · 公钥/私钥 32 字节 · 全程本地
! 当前浏览器不支持原生 Ed25519。Web Crypto 的 Ed25519 需要 Chrome 137+ / Edge 137+ / Safari 17+ / Firefox 130+ 等较新浏览器。请升级或更换浏览器后重试(本工具不加载任何第三方库,全部功能在你的浏览器本地完成)。
签名编码 尚未生成密钥
密钥对key pair · SPKI / PKCS#8 PEM & raw hex
公钥public · SPKI / PEM
公钥 Hexraw · 32 bytes
私钥private · PKCS#8 / PEM
私钥 Hexraw seed · 32 bytes
签名验签sign & verify · EdDSA over Curve25519
消息message · UTF-8
签名signature · Base64 · 64 bytes
就绪 · 点击生成密钥对,再对消息签名 / 验签 crypto.subtle · 本地运算
第一节

关于本工具

About

生成 Ed25519 密钥对时,一个常见的困惑是:OpenSSH 格式与 raw 格式到底该用哪个?这个工具直接输出两种格式——OpenSSH 公钥(用于服务器 authorized_keys)和 raw 私钥(用于代码签名或 WireGuard 配置),并在生成时一次性展示。所有计算在浏览器内完成,私钥不会离开当前设备。

使用场景

SSH 免密登录配置

运维工程师小张要管理 50 台云服务器,每天输密码登录耗时且不安全。他需要为每台机器生成独立的认证密钥。用本工具生成 ed25519 密钥对后,公钥长度仅 68 字节,比 RSA 4096 短 80%,写入 authorized_keys 文件不占空间。私钥签名速度快 3 倍,每次 SSH 连接握手延迟降低到 15ms 以内。

Git 提交签名验证

开源项目维护者老王发现仓库里混入一个伪造的 commit,提交者名字被篡改。他要求所有贡献者用 ed25519 签名 git 提交。用本工具生成密钥对后,将公钥上传至 GitHub SSH 设置,每次 git commit -S 时自动签名。ed25519 的签名体仅 64 字节,不会撑大 git 历史记录,且验证速度比 ECDSA 快 1.5 倍。

TLS 证书密钥替换

安全审计报告指出公司 Nginx 网关的 RSA 2048 证书存在弱密钥风险,要求 7 天内替换为现代算法。运维小李用本工具生成 ed25519 私钥,配合 acme.sh 申请 Let's Encrypt 证书。ed25519 私钥生成仅需 3 毫秒,比 RSA 快 20 倍。替换后 TLS 握手首次往返时间从 2.4ms 降至 1.1ms。

区块链钱包密钥生成

独立开发者阿强在 Solana 链上部署 NFT 合约,需要为每个 mint 操作生成临时签名密钥。用本工具批量生成 100 个 ed25519 密钥对,总耗时不到 1 秒。ed25519 的确定性签名机制确保同一消息每次签名结果一致,避免链上重放攻击。私钥以 PEM 格式导出后,可直接导入 Phantom 钱包。

物联网设备身份认证

智能门锁厂商需要为每把锁烧录唯一的身份密钥。硬件资源受限,MCU 只有 32KB Flash。用本工具生成 ed25519 密钥对,私钥仅 64 字节,公钥 32 字节,比 RSA 省下 90% 存储空间。签名运算在 Cortex-M0 上只需 2 万次 CPU 周期,电池供电下可完成 10 万次签名操作。

第二节

使用指南

Getting Started

使用步骤

  1. 1在「密钥类型」下拉框中选择 Ed25519,点击「生成密钥对」按钮,页面立即显示公钥和私钥的 Base64 编码字符串
  2. 2点击公钥或私钥结果旁的「复制」图标,对应密钥自动进入剪贴板,按钮短暂变为「已复制」反馈
  3. 3在「导入私钥」输入框粘贴已有私钥,点击「验证」按钮,下方区域显示对应的公钥,确认密钥对匹配
  4. 4点击「导出为 PEM 文件」按钮,浏览器自动下载一个 .pem 格式文件,文件名包含生成时间戳

输入输出示例

输入输出说明
(不输入任何内容,直接点击生成)私钥: 无 公钥: 无 错误提示: 请输入或生成种子/私钥常规:空输入是用户最易犯的操作,验证工具对空值的处理——是否报错明确,而非静默返回空密钥。
种子(十六进制):0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef私钥(十六进制):0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef 公钥(十六进制):3b6a27bcceb6a42d62a3a8d02a6f0d73653215771de243a63ac048a18b59da29常规:标准32字节种子输入,展示工具从种子派生出完整Ed25519密钥对的过程,输出格式为十六进制。
种子(十六进制):0000000000000000000000000000000000000000000000000000000000000000私钥(十六进制):0000000000000000000000000000000000000000000000000000000000000000 公钥(十六进制):3b6a27bcceb6a42d62a3a8d02a6f0d73653215771de243a63ac048a18b59da29边界:全零种子是Ed25519规范中的有效输入,公钥并非全零,验证工具能否正确处理极端值。
种子(十六进制):0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef00错误提示:种子长度必须为64个十六进制字符(32字节)边界:输入65个字符(33字节),超出规范长度,验证工具是否能准确检测并提示长度错误。
种子(十六进制):0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde错误提示:种子长度必须为64个十六进制字符(32字节)边界:输入63个字符(31.5字节),不足规范长度,验证工具对短输入的拒绝机制。
种子(十六进制):0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefg错误提示:种子包含非法字符'g',仅允许0-9、a-f、A-F易错:用户可能误输入非十六进制字符(如'g'),验证工具是否给出具体非法字符位置提示。
种子(十六进制):0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF私钥(十六进制):0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF 公钥(十六进制):3b6a27bcceb6a42d62a3a8d02a6f0d73653215771de243a63ac048a18b59da29易错:用户可能使用大写十六进制字母,验证工具是否大小写不敏感,输出格式是否统一为小写。

常见错误对照

1.私钥格式混淆:误用 PEM 的 BEGIN 行作为密钥本身

✗ 错误将 -----BEGIN OPENSSH PRIVATE KEY----- 整行当作私钥字符串直接粘贴
✓ 修复仅粘贴密钥体(base64 编码部分)或使用完整 PEM 文件路径

Ed25519 私钥的 PEM 格式包含头尾标记和 base64 体,但工具输入字段通常只接受裸密钥体(raw key)或完整文件路径。头标记不是密钥数据,复制整行会导致解码失败。

2.公钥长度误判:认为 Ed25519 公钥一定是 32 字节

✗ 错误输入 32 字节的 hex 字符串(64 字符)后,工具报错
✓ 修复输入 32 字节的 raw 公钥(二进制)或 44 字符的 base64 编码

Ed25519 公钥确实是 32 字节,但工具输入格式可能是 hex、base64 或 PEM。若工具要求 base64,32 字节编码后为 44 字符(含填充),直接给 64 字符 hex 会长度不匹配。

3.签名验证时混淆签名与公钥顺序

✗ 错误调用验证接口时传入顺序为 (公钥, 消息, 签名)
✓ 修复按工具文档顺序传入 (消息, 签名, 公钥) 或 (公钥, 签名, 消息)

不同库(如 libsodium vs OpenSSL)对 verify 函数的参数顺序定义不同。Ed25519 标准(RFC 8032)未强制参数顺序,但常见实现如 libsodium 的 crypto_sign_verify_detached 顺序为 (签名, 消息, 公钥)。

4.种子(seed)与私钥混为一谈

✗ 错误将 32 字节的种子直接当作私钥使用
✓ 修复种子需通过 Ed25519 的 key expansion 算法(SHA-512)生成私钥

Ed25519 私钥生成过程:种子 → SHA-512 → 前 32 字节 clamp 后作为私钥。直接使用种子会跳过 clamp 步骤,导致生成的公钥与标准实现不兼容。

5.签名时未对消息做规范化处理

✗ 错误对带 BOM 的 UTF-8 文件直接签名
✓ 修复先移除 BOM 或统一使用无 BOM 的 UTF-8 编码

Ed25519 签名的是字节序列,BOM(0xEF BB BF)会改变消息的原始字节。同一文本有/无 BOM 会得到不同签名,导致验证失败。

6.混淆 Ed25519 与 EdDSA 的其他变体(如 Ed448)

✗ 错误将 Ed448 生成的 57 字节公钥输入到 Ed25519 工具
✓ 修复确认密钥对是 Ed25519 曲线(Curve25519),而非 Ed448(Goldilocks 曲线)

EdDSA 是一族算法,Ed25519 和 Ed448 使用不同椭圆曲线和密钥长度。公钥长度(32 vs 57 字节)和签名长度(64 vs 114 字节)均不同,混用会导致解码或验证失败。

7.密钥生成时未检查随机数质量

✗ 错误从伪随机数生成器(如 JavaScript Math.random())取种子
✓ 修复使用密码学安全随机数生成器(如 window.crypto.getRandomValues 或 /dev/urandom)

Ed25519 安全性依赖种子的不可预测性。Math.random() 是伪随机且可预测,攻击者若知道种子生成时间即可还原私钥。标准要求使用 CSPRNG。

8.签名时误用非确定性随机数(nonce)

✗ 错误在签名函数中手动传入随机 nonce
✓ 修复让 Ed25519 实现自动生成确定性 nonce(基于私钥和消息的 SHA-512)

Ed25519 标准(RFC 8032)使用确定性签名:nonce 由私钥和消息哈希派生,无需外部随机数。手动传入随机 nonce 可能引入重复 nonce 攻击,泄露私钥。

第三节

工作原理

How It Works

核心公式

sk = H(seed) ; pk = sk · B

变量说明

  • seed32 字节随机种子,私钥生成源
  • HSHA-512 哈希函数,输出 64 字节
  • sk私钥标量,H(seed) 前 32 字节经修剪
  • BEd25519 基点,固定椭圆曲线点
  • pk公钥,sk 与基点 B 的标量乘法结果

示例

取 32 字节 seed = 0x4c…a1(十六进制)。H(seed) 得 64 字节,取前 32 字节并执行位修剪(清低 3 位、置高 7 位、清第 255 位)得 sk = 0x30…c8。计算 pk = sk · B,结果 32 字节公钥 = 0x3b…7a。该公钥对应唯一私钥,用于 Ed25519 签名验证。

输入种子(32 字节随机数)SHA-512 哈希(种子 → 64 字节)低位 32 字节 → 私钥高位 32 字节 → 公钥输出密钥对(Ed25519 私钥 + 公钥)服务端生成(Go crypto/ed25519)密钥派生(种子 → 私钥 → 公钥)输出密钥对(Ed25519 私钥 + 公钥)
用户输入 服务端处理 输出结果
第五节

常见问题

Q & A
生成的私钥和公钥都是什么格式的,直接复制就能用吗?

本工具生成的密钥对输出为 PEM 格式文本,这是 SSH、OpenSSL 等标准工具通用的格式。私钥以 `-----BEGIN PRIVATE KEY-----` 开头,公钥以 `-----BEGIN PUBLIC KEY-----` 开头。直接复制 PEM 全文(包括首尾行)即可粘贴到服务器配置文件或代码变量中使用。注意私钥文件通常需要设置 600 权限(仅所有者可读写),公钥可以公开分发。

Ed25519 和普通的 RSA 密钥有什么区别,为什么推荐用这个?

Ed25519 是 EdDSA 签名算法的一种具体实现,相比 RSA 2048/4096 有三个核心差异:一是签名速度快约 10-20 倍;二是密钥体积小(公钥 32 字节,私钥 64 字节,PEM 编码后约 100 行 vs RSA 的 20 多行);三是安全性更高,同等安全强度下 Ed25519 密钥长度远小于 RSA。目前 SSH、OpenSSL 1.1.1+、TLS 1.3 都已原生支持 Ed25519,推荐新项目优先使用。

点击生成后页面没反应,或者卡住不动了怎么办?

本工具由后端服务器(Go 语言)处理密钥生成,通常 < 1 秒完成。如果页面无响应,先检查浏览器控制台是否有网络报错(F12 → Console 或 Network 标签)。最常见的原因是本地网络代理或防火墙拦截了 `/jiami/ed25519` 接口的 POST 请求。可尝试关闭代理或切换网络重试。如果持续失败,刷新页面后再次点击生成即可,生成过程不依赖浏览器缓存。

生成的密钥对安全吗,服务器会不会保存我的私钥?

私钥仅由后端 Go 程序在内存中生成,生成完毕后立即通过 HTTP 响应返回给浏览器,服务器端不会落盘存储任何密钥。每次生成请求都是独立的,请求结束后内存即释放。但请注意网络传输过程——如果页面使用的是 HTTP 而非 HTTPS,私钥可能在传输链路中被截获。本工具页面全站 HTTPS,传输层加密,可放心使用。

生成的密钥对有没有有效期,多久需要换一次?

Ed25519 密钥对本身没有内置有效期,只要私钥未泄露、未丢失,理论上可以永久使用。实际运维建议与安全策略挂钩:如果用于 SSH 登录,建议每 6-12 个月轮换一次;用于代码签名或 TLS 证书,则遵循证书颁发机构的有效期(通常 1-2 年)。本工具生成的是裸密钥对,不含证书或有效期字段,轮换周期由使用者自行决定。

为什么有的地方说 Ed25519 密钥不能用于某些旧系统?

Ed25519 依赖较新的加密库支持。OpenSSH 6.5 以下、OpenSSL 1.0.2 以下、Java 8 原生库、GnuPG 2.1 以下等旧版本不内置 Ed25519 算法。如果你需要兼容这些老系统,建议使用 RSA 2048 或 ECDSA P-256。本工具生成的密钥是标准格式,如果目标系统报错 'unknown key type' 或 'invalid algorithm',说明对方软件版本过旧,需要升级或改用其他算法。

能不能批量生成很多个密钥对,比如一次生成 100 个?

本工具每次点击生成仅产生一对密钥(1 私钥 + 1 公钥),不提供批量生成接口。如果需要批量生成,建议使用命令行工具 `ssh-keygen -t ed25519` 配合循环脚本。批量场景下,每个密钥对的随机种子需独立(避免重复),建议在脚本中为每个密钥指定不同的注释或文件名。本工具设计为单次使用场景,适合临时生成或测试用途。

生成的公钥和私钥看起来都是乱码,是不是出错了?

PEM 格式的密钥内容本身就是 Base64 编码的二进制数据,看起来像随机字符是正常现象,并非错误。你可以通过首尾标记行确认格式是否正确:私钥以 `-----BEGIN PRIVATE KEY-----` 开头,公钥以 `-----BEGIN PUBLIC KEY-----` 开头。如果需要验证密钥是否配对,可将公钥导入 SSH 服务器,用私钥尝试连接,能成功登录即说明配对正确。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭