How to Decrypt private key(String) with passphrase - java

问题描述 投票:0回答:2

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

-----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);

我也尝试过使用 bouncy castle 但我收到以下错误

class "org.bouncycastle.asn1.pkcs.RSAPublicKey" 的签名者信息 不匹配同包中其他类的签名者信息

注:我用的是jdk11

我将不胜感激。谢谢

java encryption bouncycastle private-key
2个回答
0
投票

您需要确保您的私钥已使用 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
仍然只支持 AES 密码,仅根据 JDK-8076999。这就是为什么你会得到这个错误:

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

0
投票
public PrivateKey readPrivateKey(String privateKeyContent) {
  PrivateKey privateKey = null;
  try {
    PemReader pemReader = new PemReader(new StringReader(privateKeyContent));
    byte[] content = pemReader.readPemObject().getContent();
    EncryptedPrivateKeyInfo encryptPKInfo = new EncryptedPrivateKeyInfo(content);
    Cipher cipher = Cipher.getInstance(encryptPKInfo.getAlgName());
    PBEKeySpec pbeKeySpec = new PBEKeySpec(passPhrase.toCharArray());
    SecretKeyFactory secFac = SecretKeyFactory.getInstance(encryptPKInfo.getAlgName());
    Key pbeKey = secFac.generateSecret(pbeKeySpec);
    AlgorithmParameters algParams = encryptPKInfo.getAlgParameters();
    cipher.init(Cipher.DECRYPT_MODE, pbeKey, algParams);
    KeySpec pkcs8KeySpec = encryptPKInfo.getKeySpec(cipher);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    privateKey = kf.generatePrivate(pkcs8KeySpec);
  } catch (Exception e) {
  }
  return privateKey;
}
© www.soinside.com 2019 - 2024. All rights reserved.