当前位置: 首页 > 知识库问答 >
问题:

如果您知道曲线名称,如何构造私钥

杨海
2023-03-14

要求:对于给定的命名曲线,发送尽可能少的数据,以便接收者可以构造EC Private ateKey。

我目前正在Android上使用BouncyCastle/SpongyCastle。这就是我到目前为止所理解的。

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
ECGenParameterSpec ecGenParameterSpec = new ECGenParameterSpec("secp112r2");
keyGen.initialize(ecGenParameterSpec, new SecureRandom());
KeyPair keyPair = keyGen.generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();

// privateKey.getEncoded() -> gives DER encoded private key. I can construct PrivateKey from that easily
byte[] derEncodedPrivateKeyBytes = privateKey.getEncoded(); // byteArray length-> 80
KeyFactory kf = KeyFactory.getInstance("EC");
PrivateKey key = kf.generatePrivate(new PKCS8EncodedKeySpec(derEncodedPrivateKeyBytes));

现在,使用Bouncy/海绵城堡,我得到了私钥的实际点,没有任何其他信息,这是在derEncoding。

ECPrivateKeyParameters param = (ECPrivateKeyParameters) ECUtil.generatePrivateKeyParameter(privateKey);
int lenghtOfKey = param.getD().toByteArray().length; // length - 14

问题:我如何重建Private ateKey对象,只需使用点D(privateKeyParam.getD())和曲线名称?使用曲线名称,我可以得到ECCurveParameters。

编辑:我能够使用私钥点(praram.getD())构造ECPrivate ateKeyParameters,但仍然无法弄清楚如何从ECPrivate ateKeyParameters生成Private ateKey。

X9ECParameters ecCurve = ECNamedCurveTable.getByName(curveName);
ECDomainParameters ecDomainParam = new ECDomainParameters(ecCurve.getCurve(),
        ecCurve.getG(), ecCurve.getN(), ecCurve.getH(), ecCurve.getSeed());
ECPrivateKeyParameters generatedECPrivateKeyParams = new ECPrivateKeyParameters(param.getD(), ecDomainParam);

共有1个答案

娄鹤轩
2023-03-14

我能够弄清楚如何从BigInteger D重新构建EC PrivateKey。

 public static PrivateKey getPrivateKeyFromECBigIntAndCurve(BigInteger s, String curveName) {
    X9ECParameters ecCurve = ECNamedCurveTable.getByName(curveName);
    ECParameterSpec ecParameterSpec = new ECNamedCurveSpec(curveName, ecCurve.getCurve(), ecCurve.getG(), ecCurve.getN(), ecCurve.getH(), ecCurve.getSeed());
    ECPrivateKeySpec privateKeySpec = new ECPrivateKeySpec(s, ecParameterSpec);
    try {
        KeyFactory keyFactory = KeyFactory.getInstance("EC");
        return keyFactory.generatePrivate(privateKeySpec);
    } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
        e.printStackTrace();
        return null;
    }
}
 类似资料:
  • 问题内容: 是否可以解组未知字段的JSON?该字段名称始终是不同的,但是结构是相同的。JSON是POST请求的结果。 我的代码: 问题答案: 如果您不知道键,只需使用一个映射,并且映射的值类型可能是描述该结构的结构: 请注意,您必须导出字段才能使用此功能! 和解编代码: 输出(在Go Playground 上尝试):

  • 问题内容: 目前,我正在更新我的x.509证书库以支持ECC。实现的大多数构建器都使用publicKey并从密钥派生算法等。在RSA中,这很简单,您可以检查密钥的算法,然后可以验证位长。但是,对于ECC,密钥是基于曲线的,曲线名称(当然)需要在证书中指定(作为OID)。 我现在正在研究的问题是找到一种方法来从java.security.interfaces.ECPublicKey或org.boun

  • 问题内容: 有没有一种方法可以强制(子)类在C#或Java中使用具有特定签名或特定静态方法的构造函数? 您显然不能为此使用接口,而且我知道它的用法会受到限制。我确实发现它有用的一个实例是您想要实施一些设计准则时,例如: 异常 它们都应该具有四个规范的构造函数,但是没有办法强制执行。您必须依靠FxCop之类的工具(C#情况)才能捕获这些信息。 运算符 没有指定可以对两个类求和的合约(C#中的oper

  • 我能够使用带RSA私钥的bouncy castle和“SHA256withRSA”算法对证书进行签名。我使用下面的链接作为参考来实现这一点。使用Bouncy Castle签署CSR 现在我有椭圆曲线密钥与ECDSA签署我的CA。因此,我想通过这些CA用EC密钥和“SHA256 with ECDSA”算法签署证书。然而,我被困在下面的片段特定于RSA密钥,我想使用EC密钥。 请帮助我如何使用ECDS

  • 问题内容: 我有两个32个字节长的字节数组,分别表示EC公共密钥的X和Y值。我知道曲线是命名曲线“ prime256v1”。 如何将其转换为Java PublicKey对象? JCE似乎不提供使用命名曲线的任何便利。 Bouncycastle的示例代码似乎无法与我可以找到的任何版本的bouncycastle一起编译。 WTF? 问题答案: 事实证明,实际上还有另一种方法可以做到这一点。显然,可以使

  • 问题内容: 这是: …初始化a的唯一方法? 如果我不知道需要分配多少字节怎么办? 编辑: 更多详细信息: 我正在将一种图像文件格式转换为TIFF文件。问题是起始文件格式可以是任意大小,但是我需要将TIFF中的数据写入小端。因此,我正在阅读最终要打印到TIFF文件的内容到ByteBuffer中,以便可以将所有内容放入Little Endian中,然后再将其写入外文件中。我猜想,因为我知道IFD有多长