You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java 15+中从Ed25519私钥推导公钥(无第三方依赖)

在Java 15及以上版本中从Ed25519私钥字节数组推导公钥(无第三方库)

Java 15及以上版本通过原生特性支持Ed25519算法,虽然标准库未直接提供从原始私钥字节推导公钥的直白API,但可以借助KeyPairGenerator结合私钥规范实现,全程无需依赖第三方库。

实现步骤与代码示例

  1. 用Ed25519PrivateKeySpec包装原始32字节私钥(Ed25519私钥种子固定为32字节)
  2. 初始化KeyPairGenerator并传入私钥规范,生成包含对应公钥的密钥对
  3. 从公钥对象中提取原始32字节公钥
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.spec.Ed25519PrivateKeySpec;
import java.security.interfaces.Ed25519PublicKey;

public class Ed25519KeyDerivation {
    public static byte[] derivePublicKey(byte[] rawPrivateKey) throws Exception {
        // 校验Ed25519私钥种子长度
        if (rawPrivateKey.length != 32) {
            throw new IllegalArgumentException("Ed25519私钥种子必须为32字节");
        }

        // 构造私钥规范
        Ed25519PrivateKeySpec privateKeySpec = new Ed25519PrivateKeySpec(rawPrivateKey);

        // 初始化密钥对生成器,基于私钥规范派生公钥
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");
        kpg.initialize(privateKeySpec);
        KeyPair keyPair = kpg.generateKeyPair();

        // 提取原始公钥字节数组
        Ed25519PublicKey publicKey = (Ed25519PublicKey) keyPair.getPublic();
        return publicKey.getBytes();
    }
}

关键说明

  • Ed25519PrivateKeySpec:Java 15引入的类,用于封装Ed25519私钥的原始种子字节
  • KeyPairGenerator.initialize(Ed25519PrivateKeySpec):此方法会基于传入的私钥种子直接派生对应的公钥,而非生成全新密钥对
  • Ed25519PublicKey.getBytes():返回原始的32字节公钥,区别于getEncoded()返回的X.509编码格式公钥

内容的提问来源于stack exchange,提问作者Diego Dupin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:20:57