Skip to content
Advertisement

How to decrypt a password protected RSA key in java?

I’m writing a code to consume a private key to encrypt and decrypt a message. The problem is that the key i use is protected by a passphrase. So i have to decrypt the key itself before use it to encrypt and decrypt. This is the header of the key content:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,E51B4CCF38530A32

b9gvBvJNyUxA/2AH5mb+7dNcIns05EIXlbiM47xSUiQZgOdbP5ZHy5WL6S+uxU7s
.
.
.
-----END RSA PRIVATE KEY-----

How can I achieve that in Java?

Advertisement

Answer

This is an encrypted private RSA key in PKCS#1 format, PEM encoded, which is most convenient to import using BouncyCastle:

import java.io.FileReader;
import java.security.PrivateKey;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.openssl.PEMEncryptedKeyPair;
import org.bouncycastle.openssl.PEMKeyPair;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.bc.BcPEMDecryptorProvider;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;

...

String path = "...";
String password = "...";
try (PEMParser pemParser = new PEMParser(new FileReader(path))){

    PEMEncryptedKeyPair encKeyPair = (PEMEncryptedKeyPair)pemParser.readObject();
    PEMKeyPair keyPair = encKeyPair.decryptKeyPair(new BcPEMDecryptorProvider(password.toCharArray()));

    JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
    PrivateKeyInfo privKeyInfo = keyPair.getPrivateKeyInfo();
    PrivateKey privKey = converter.getPrivateKey(privKeyInfo);
}
User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement