【问题标题】:How to decrypt a private key in Java (without BC openssl)如何在 Java 中解密私钥(没有 BC openssl)
【发布时间】:2015-11-25 04:23:41
【问题描述】:

是否可以使用 JCE 和/或 BouncyCastle 提供程序(不使用 openssl 包)解密加密的 RSA(或其他,无关紧要的)私钥?

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

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

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

【问题讨论】:

  • 您可以解密 Java 中使用 Java 支持的密码加密的任何内容。
  • 您是否在密钥库中使用密码保护了密钥?

标签: java encryption bouncycastle jce pkcs#8


【解决方案1】:

如果您有一个二进制格式的加密 PKCS#8 密钥(即不是 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 格式,请删除页眉(第一行)、页脚(最后一行)并将剩余内容从 base64 转换为常规字节数组。

【讨论】:

  • 解密私钥 pem 字符串 java.io.IOException: ObjectIdentifier() -- 数据不是对象 ID (tag = 48) 时出现以下错误
猜你喜欢
  • 2017-07-07
  • 1970-01-01
  • 2016-05-18
  • 2020-02-28
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多