我正在尝试解密字符串中的私钥。密钥也有一个密码。我的私钥文件具有以下页眉和页脚:
-----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
我将不胜感激。谢谢
您需要确保您的私钥已使用 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
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;
}