Bouncy Castle: PEMReader => PEMParser

С сертификатом PEM вроде

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,B9846B5D1803E.....

используя BC 1.46, я извлекаю пару ключей с помощью следующего кода:

int myFunc(String pemString, char [] password) {

    ByteArrayInputStream tube = new ByteArrayInputStream(pemString.getBytes());

    Reader fRd = new BufferedReader(new InputStreamReader(tube));

    PEMReader pr = new PEMReader(fRd, new Password (password), "BC");

     try {
            Object o = pr.readObject();
            if (o instanceof KeyPair)
    .....

Сейчас я только что установил BC 1.48, и они говорят мне, что PEMReader устарел и должен быть заменен на PEMParser.

Моя проблема, AFAIK, в PEMParser нет места для пароля.

Может ли кто-нибудь дать мне пример того, как перенести мой код в версию PEMParser?

Ответы

Ответ 1

Мне просто нужно было решить ту же проблему и не нашел ответа. Поэтому я некоторое время изучал BC API и нашел решение, которое работает для меня. Мне нужно было прочитать секретный ключ из файла, поэтому параметр privateKeyFileName вместо параметра pemString в методе myFunc.

Использование BC 1.48 и PEMParser:

int myFunc(String privateKeyFileName, char [] password) {
     File privateKeyFile = new File(privateKeyFileName); // private key file in PEM format
     PEMParser pemParser = new PEMParser(new FileReader(privateKeyFile));
     Object object = pemParser.readObject();
     PEMDecryptorProvider decProv = new JcePEMDecryptorProviderBuilder().build(password);
     JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
     KeyPair kp;
     if (object instanceof PEMEncryptedKeyPair) {
        System.out.println("Encrypted key - we will use provided password");
        kp = converter.getKeyPair(((PEMEncryptedKeyPair) object).decryptKeyPair(decProv));
    } else {
        System.out.println("Unencrypted key - no password needed");
        kp = converter.getKeyPair((PEMKeyPair) object);
    }
}

Ответ 2

Для версии 1.55 bcpkix-jdk15on код дешифрования изменяется на это:

kp = ((PEMEncryptedKeyPair) object).decryptKeyPair(decryptorProvider);

Я не проверял, является ли это ошибкой в ​​вышеупомянутом ответе или просто разницей API между версиями.