如何在Java 15+中从Ed25519私钥推导公钥(无第三方依赖)
在Java 15及以上版本中从Ed25519私钥字节数组推导公钥(无第三方库)
Java 15及以上版本通过原生特性支持Ed25519算法,虽然标准库未直接提供从原始私钥字节推导公钥的直白API,但可以借助KeyPairGenerator结合私钥规范实现,全程无需依赖第三方库。
实现步骤与代码示例
- 用
Ed25519PrivateKeySpec包装原始32字节私钥(Ed25519私钥种子固定为32字节) - 初始化
KeyPairGenerator并传入私钥规范,生成包含对应公钥的密钥对 - 从公钥对象中提取原始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
相关产品推荐
相关产品推荐

