Тестовый код Bouncy Castle содержит пример того, как прочитать закрытый ключ RSA, в функции ParserTest.doOpenSslRsaTest .Вот небольшая модификация этого примера: он может обрабатывать как зашифрованные, так и незашифрованные ключи в качестве входных данных (и в последнем случае ключевая фраза не будет использоваться):
private static KeyPair pemRSAP1ReadKeyPair(String pemfilename, String passphrase)
throws FileNotFoundException, IOException
{
KeyPair result = null;
FileReader reader = new FileReader(pemfilename);
PEMParser parser = new PEMParser(reader);
Object pemobj = parser.readObject();
parser.close();
reader.close();
if (pemobj == null ||
!((pemobj instanceof PEMKeyPair) || (pemobj instanceof PEMEncryptedKeyPair))) {
System.out.println("Unable to read key pair");
} else {
PEMKeyPair pemkp;
if (pemobj instanceof PEMEncryptedKeyPair) {
PEMEncryptedKeyPair kp = (PEMEncryptedKeyPair)pemobj;
PEMDecryptorProvider decprov = new BcPEMDecryptorProvider(passphrase.toCharArray());
pemkp = kp.decryptKeyPair(decprov);
} else {
pemkp = (PEMKeyPair)pemobj;
}
result = new JcaPEMKeyConverter().setProvider("BC").getKeyPair(pemkp);
}
return result;
}
Пример для писателясторона может быть найдена в AllTests.encryptedTestNew , который примерно выглядит следующим образом:
private static void pemRSAP8WritePrivateKey(PrivateKey key, String pemfilename, String passphrase)
throws IOException, OperatorCreationException
{
FileWriter writer = new FileWriter(pemfilename);
JcaPEMWriter pemwriter = new JcaPEMWriter(writer);
JceOpenSSLPKCS8EncryptorBuilder encryptorbuilder =
new JceOpenSSLPKCS8EncryptorBuilder(PKCS8Generator.AES_128_CBC).
setProvider("BC").
setPasssword(passphrase.toCharArray());
OutputEncryptor encryptor = encryptorbuilder.build();
PKCS8Generator pkcs8 = new JcaPKCS8Generator(key, encryptor);
pemwriter.writeObject(pkcs8);
pemwriter.close();
writer.close();
}
Собираем его вместе для преобразования:
Security.addProvider(new BouncyCastleProvider());
try {
KeyPair kp = pemRSAP1ReadKeyPair("rsakey_enc.pem", "changeit");
PrivateKey privkey = kp.getPrivate();
if (!(privkey instanceof RSAPrivateKey)) {
System.out.println("PEM input file does not contain an RSA private key");
} else {
pemRSAP8WritePrivateKey(privkey, "rsakey.p8", "abracadabra");
}
} catch (Exception e) {
System.out.println("Caught exception: " + e.getMessage());
}