【问题标题】:How to Decrypt private key(String) with passphrase - java如何使用密码解密私钥(字符串) - java
【发布时间】:2019-12-15 14:49:10
【问题描述】:

我正在尝试解密字符串中的私钥。密钥也有一个密码。我的私钥文件有以下页眉和页脚:

-----BEGIN ENCRYPTED PRIVATE KEY-----\n
-----END ENCRYPTED PRIVATE KEY-----\n

我可以在私钥中看到更多 '\n' 新行。我希望它是 pem 格式的。

以下代码的最后一行给了我这个错误:

PBE 参数解析错误:需要 AES 的对象标识符 密码

这是我试过的代码:

String privateKeyPEM = a;
privateKeyPEM = privateKeyPEM.replace("-----BEGIN ENCRYPTED PRIVATE KEY-----\n", "");
privateKeyPEM = privateKeyPEM.replace("-----END ENCRYPTED PRIVATE KEY-----\n", "");
byte[] encoded = Base64.getMimeDecoder().decode(privateKeyPEM);
EncryptedPrivateKeyInfo pkinfo = new EncryptedPrivateKeyInfo(encoded);

我也尝试过使用充气城堡,但出现以下错误

类“org.bouncycastle.asn1.pkcs.RSAPublicKey”的签名者信息 与同一包中其他类的签名者信息不匹配

注意:我使用的是 jdk11

我将不胜感激。谢谢

【问题讨论】:

  • 您的问题中没有足够的信息来确定您遇到问题的原因。当我使用具有相同格式的已知有效私钥的代码时,我没有收到任何错误。
  • (1) 是的 PEM 格式在 base64 'blob' 中确实有(必需的)换行符;请参阅 wikipedia 和/或 rfc7468 第 2 节。 (2) 确认您使用的是javax/crypto/EncryptedPrivateKeyInfo,而不是具有相同相对名称的其他几个类中的任何一个。如果是这样,ctor 永远不应该给出这样的错误,但是添加或后续的 getKeySpec(various) 可能会这样做,具体取决于密钥文件中的数据。如果您有 openssl,请查看 openssl asn1parse -i -in pemfile(或 -in derfile -inform der),或添加到您的 Q(通过编辑)并编辑最后一个八位字节字符串(这是您的实际加密密钥数据)
  • (3) 你的 bouncycastle 问题是另一个问题;如果您想追求它,请提出一个单独的问题并准确描述您正在使用的罐子。特别是如果您将 bcprov 放入任何重新包装中,例如 'one-jar' 'single-jar' maven gradle Ecliipse Intellij Netbeans 等,这些都不起作用。
  • 如果您可以为示例加密消息提供密钥(也称为minimal reproducible example),那么有人可以进一步调试它。

标签: java encryption bouncycastle private-key


【解决方案1】:

您需要确保您的私钥使用 AES 密码加密。

在您的加密私钥文件的开头,您可以看到如下内容:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-CBC,2241040B6A6E0FBE

DEK-Info 告诉您正在使用什么加密算法。

您可以使用openssl 转换密码:

openssl rsa -in des.pem -aes256 -out aes.pem

获取 AES 加密私钥:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,40FACC69B7E9ED576BF8300B871701EB

截至今天,javax.crypto 仍然仅支持 JDK-8076999 的 AES 密码。这就是您会收到此错误的原因:

PBE parameter parsing error: expecting the object identifier for AES cipher

【讨论】:

    猜你喜欢
    • 2015-07-31
    • 2015-11-02
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    相关资源
    最近更新 更多