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

使用Bouncy Castle重建私钥和公钥?

孙才捷
2023-03-14

如果我使用getEncoded从Java中Bouncy Castle中的公钥或私钥获取实际密钥(实际类似乎是BCECPublicKey和BCECPrivateKey)。是否可以重建关键对象以在代码中使用它们?

我在Stack Overflow中发现了如何将整个对象序列化为二进制(然后序列化到磁盘),然后返回到二进制和适当类的对象,但我相信序列化包含实现细节,如果我尝试将这些键与Bouncy Castle以外的任何东西一起使用,它将失败。我现在不想这样做,但我想让我的程序面向未来。

这就是我创建密钥的方式:

    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC");
    keyPairGenerator.initialize(new ECGenParameterSpec("secp521r1"), new SecureRandom());
    java.security.KeyPair keyPair = keyPairGenerator.generateKeyPair();

    privateKey = keyPair.getPrivate();
    publicKey = keyPair.getPublic();

共有1个答案

慕阳伯
2023-03-14

KeyFactory 用于在编码的键和表示它们的 Java 类之间进行转换。但是,KeyFactory 实例不会直接在字节数组和 Key 类之间进行转换。相反,您必须已经知道编码使用的格式,然后使用构造函数中的字节数组创建 KeySpec 对象。格式可以通过调用密钥上的 getFormat() 方法来确定。下面是一个示例,说明了其中的一些要点。

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import java.security.*;
import java.security.spec.ECGenParameterSpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

public class Main {

    public static void main(String[] args) throws Exception{
        Security.addProvider(new BouncyCastleProvider());
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC");
        keyPairGenerator.initialize(new ECGenParameterSpec("secp521r1"), new SecureRandom());
        java.security.KeyPair keyPair = keyPairGenerator.generateKeyPair();

        PrivateKey privateKey = keyPair.getPrivate();
        System.out.println(privateKey.getFormat());
        PublicKey publicKey = keyPair.getPublic();
        System.out.println(publicKey.getFormat());

        // A KeyFactory is used to convert encoded keys to their actual Java classes
        KeyFactory ecKeyFac = KeyFactory.getInstance("EC", "BC");

        // Now do a round-trip for a private key,
        byte [] encodedPriv = privateKey.getEncoded();
        // now take the encoded value and recreate the private key
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(encodedPriv);
        PrivateKey privateKey2 = ecKeyFac.generatePrivate(pkcs8EncodedKeySpec);

        // And a round trip for the public key as well.
        byte [] encodedPub = publicKey.getEncoded();
        X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(encodedPub);
        PublicKey publicKey2 = ecKeyFac.generatePublic(x509EncodedKeySpec);
        System.out.println(publicKey2);

    }
}
 类似资料:
  • 我需要在C#中加密数据,以便将其传递给Java。Java代码属于第三方,但我得到了相关的源代码,因此我决定,由于Java使用Bouncy Castle库,所以我将使用C#端口。 解密工作正常。但是,解密仅在使用私钥使用encrypt时有效,而不是使用公钥。使用公钥时,解密失败,出现。 编辑: 我还添加了一个单元测试,它证明公钥等于从私钥中提取的公钥:

  • 我想在Java中通过SSL/TLS建立一个客户机服务器通信。服务器是多线程的。使用openssl,我充当自己的CA(为权威创建私钥和自签名证书)。现在我要为我的服务器和客户端创建密钥和证书,这些密钥和证书是从我创建的CA签名的。 1)我必须根据提示为每个客户创建证书和密钥吗?还是另一种“自动”方式,例如使用脚本? 2)我已经看到用于设置密钥库的代码 问题是我如何单独创建这些jks文件?public

  • 我在使用Java Bouncycastle的客户机和使用Python RSA库的密钥服务器之间交换私钥时遇到了困难。PEM格式用于通过REST传输密钥。keyserver无法解密我提供的密钥(加密密码更改时需要),它需要PKCS#1或PKCS#8密钥和PEM,如下所示: 但是BouncyCastle的输出(使用JCEpeEncryptorBuilder和JcaMiscPEMGenerator)的起

  • 正如您所看到的,密钥长度非常不同,并且我用前者创建的P12文件不会导入到Windows证书存储中。我一定是用C#BouncyCastle做错了什么,但看不出是什么(查看PemWriter和其他相关类的源代码并没有指出任何明显的错误)。 任何帮助都将不胜感激。谢了。

  • 问题内容: 我正在寻找一个Java库或代码来即时生成证书,公共和私有密钥,而无需使用第三方程序(例如openssl)。 我认为是从Java代码中获取keytool + openssl的东西。 考虑使用ssl和客户端身份验证保护的基于Java servlet的Web应用程序。我希望Servlet容器仅在请求时使用Java代码生成客户端证书(例如pkcs12格式)。 问题答案: 您可以使用一对或密钥在

  • 我正在尝试在BouncyCastle中导入公共和私有ECDH密钥。为了导入公钥,我使用了下面的C#代码,代码运行良好: 公钥:042E3E5CCF6B9AB04BE7A22F3FACCDE73C87E87155394A34815408A896CA18A374DAC669AF36220FC863767F4AF47507C5BC221FC4A19874DAF39B074E3EB8 私钥:be3f9bf