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

Bouncy Castle如何基于EdDSA爱德华曲线参数重构公私钥

爱德华曲线密钥参数通过Bouncy Castle重构公私钥方案

以下示例基于Java版Bouncy Castle库实现,操作前请先确保项目已引入对应版本的bcprov、bcpkix依赖。

前置操作

首先注册Bouncy Castle安全提供者,全局只需执行一次:

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.Security;

Security.addProvider(new BouncyCastleProvider());

重构私钥

你需要提前准备好私钥参数d的字节数组、对应爱德华曲线的参数实例:

  • 若使用标准命名曲线(如Ed25519、Ed448),可直接通过名称获取曲线参数:
    import org.bouncycastle.jce.spec.EdECParameterSpec;
    import org.bouncycastle.jce.EdECNamedCurveTable;
    
    EdECParameterSpec curveParams = EdECNamedCurveTable.getParameterSpec("Ed25519");
    
  • 若使用自定义爱德华曲线,需自行实例化EdECParameterSpec,填入曲线的系数、阶、基点等和生成密钥时完全一致的参数。
  • 将私钥参数d转换为符合曲线要求字节序的字节数组(Ed25519默认要求32字节小端序),构造EdECPrivateKeySpec并生成私钥:
    import org.bouncycastle.jce.spec.EdECPrivateKeySpec;
    import java.security.KeyFactory;
    import java.security.PrivateKey;
    
    // dBytes为你持有的私钥参数d对应的字节数组
    EdECPrivateKeySpec privSpec = new EdECPrivateKeySpec(curveParams, dBytes);
    KeyFactory keyFactory = KeyFactory.getInstance("EdDSA", "BC");
    PrivateKey privateKey = keyFactory.generatePrivate(privSpec);
    

重构公钥

你需要提前准备好公钥参数x的字节数组、和私钥一致的曲线参数实例:

  • 将公钥参数x转换为符合曲线要求字节序的字节数组,构造EdECPublicKeySpec并生成公钥:
    import org.bouncycastle.jce.spec.EdECPublicKeySpec;
    import org.bouncycastle.math.ec.rfc8032.EdECPoint;
    import java.security.PublicKey;
    import java.math.BigInteger;
    
    // xBytes为你持有的公钥参数x对应的字节数组
    EdECPoint xPoint = new EdECPoint(false, new BigInteger(1, xBytes));
    EdECPublicKeySpec pubSpec = new EdECPublicKeySpec(curveParams, xPoint);
    PublicKey publicKey = keyFactory.generatePublic(pubSpec);
    

低版本Bouncy Castle兼容方案

若你使用的Bouncy Castle版本不支持EdEC*系列类,可直接使用底层参数类构造:

import org.bouncycastle.crypto.params.Ed25519PrivateKeyParameters;
import org.bouncycastle.crypto.params.Ed25519PublicKeyParameters;
import org.bouncycastle.jcajce.provider.asymmetric.edec.JcaEdECPrivateKey;
import org.bouncycastle.jcajce.provider.asymmetric.edec.JcaEdECPublicKey;

// 构造私钥
Ed25519PrivateKeyParameters privParams = new Ed25519PrivateKeyParameters(dBytes, 0);
PrivateKey privateKey = new JcaEdECPrivateKey(privParams, curveParams);

// 构造公钥
Ed25519PublicKeyParameters pubParams = new Ed25519PublicKeyParameters(xBytes, 0);
PublicKey publicKey = new JcaEdECPublicKey(pubParams, curveParams);

注意:请确保参数d、x的字节顺序和生成密钥时的字节顺序完全一致,爱德华曲线默认多为小端序,和常规BigInteger的大端序相反,字节序错误会直接导致生成的密钥无效。

内容的提问来源于stack exchange,提问作者Naimisha Jogi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:54:05