java - 如何在Java中解密私钥(不使用BC openssl)

标签 java encryption bouncycastle jce pkcs#8

是否可以使用 JCE 和/或 BouncyCaSTLe 提供程序(不使用 openssl bundle )解密加密的 RSA(或其他,不重要)私钥?

我可以使用 PrivateKeyFactory 很好地读取未加密的 key 。

谷歌搜索这让我通过使用 PEMReader(来自 BC openssl bundle )的示例,它应用了密码,但是 - 不想使用 openssl bundle ,不一定想使用 PEM 格式,我可以使用 PemReader(来自提供程序包)解码 PEM。问题是之后我能用它做什么。

我正在寻找一些大型功能或一系列可以做到这一点的功能,即我不打算解析加密 key 的 ASN1、找出加密方法、通过密码传递输入等.

最佳答案

如果您有二进制格式的加密 PKCS#8 key (即不是 PEM 格式),以下代码显示如何检索私钥:

public PrivateKey decryptKey(byte[] pkcs8Data, char[] password) throws Exception {
    PBEKeySpec pbeSpec = new PBEKeySpec(password);
    EncryptedPrivateKeyInfo pkinfo = new EncryptedPrivateKeyInfo(pkcs8Data);
    SecretKeyFactory skf = SecretKeyFactory.getInstance(pkinfo.getAlgName());
    Key secret = skf.generateSecret(pbeSpec);
    PKCS8EncodedKeySpec keySpec = pkinfo.getKeySpec(secret);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    return kf.generatePrivate(keySpec);
}

如果您有 PEM 格式,请删除 header (第一行)、页脚(最后一行)并将剩余内容从 Base64 转换为常规字节数组。

关于java - 如何在Java中解密私钥(不使用BC openssl),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32306081/

相关文章:

java - Canvas 未绘制到 JFrame

c++ - 是否有一个库可以生成一个字符串,该字符串将散列 (SHA1) 到给定的输入?

SSL 握手异常 : jetty server does not pick any of cipher to initiate SSL handshake

java - BouncycaSTLe 无法生成私钥 - 未知 KeySpec 类型 : java. security.spec.X509EncodedKeySpec

java - 使用 sshj 时为 "JCE cannot authenticate the provider BC"

Java DOM 转换和解析具有无效 XML 字符的任意字符串?

JavaFX - Stage 参数的重点是什么?

Java - 泛型类型 vector 的多维数组

encryption - 使用与 key 相同的字符串来加密字符串是否安全?

C#序列化一个没有无参数构造函数的类