【发布时间】: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