KeyPair от PEMKeyPair с BouncyCastle на Android - PullRequest
0 голосов
/ 02 февраля 2020

Получено исключение на Android при преобразовании PEMKeyPair в KeyPair:

 org.bouncycastle.openssl.PEMException: unable to convert key pair: The BC provider no longer provides an implementation for KeyFactory.RSA.  Please see https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html for more details.

Этот код отлично работает на vanilla Java на моем рабочем столе P C, но не работает на Android:

PrivateKey pk=null;

JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");

        if (object instanceof PEMKeyPair)
        {
            PEMKeyPair k = (PEMKeyPair) object;
            KeyPair key = converter.getKeyPair(k);
            pk = key.getPrivate();
        }else
...

Как решить эту проблему?

1 Ответ

0 голосов
/ 02 февраля 2020

Вы найдете ответ на странице , которая была зарегистрирована в сообщении об исключении:

Начиная с Android P, мы планируем отказаться от некоторых функций из B C провайдер, дублированный провайдером AndroidOpenSSL (также известным как Conscrypt). Это повлияет только на приложения, которые явно указывают поставщика B C при вызове методов getInstance(). Чтобы быть ясным, мы не делаем это, потому что мы обеспокоены безопасностью реализаций от поставщика B C, а не потому, что дублирующая функциональность влечет за собой дополнительные расходы и риски, но не дает большой выгоды.

Если вы укажете провайдера по имени или по экземпляру - например, Cipher.getInstance("AES/CBC/PKCS7PADDING", "BC") или Cipher.getInstance("AES/CBC/PKCS7PADDING", Security.getProvider("BC")) - поведение, которое вы получите в Android P, будет зависеть от того, какой уровень API предназначен для вашего приложения. Для приложений, ориентированных на уровень API до P, вызов возвратит реализацию B C и зарегистрирует предупреждение в журнале приложений. Для приложений с таргетингом Android P или более поздней, вызов выдаст NoSuchAlgorithmException.

. Чтобы решить эту ошибку:

Чтобы устранить эту проблему, следует прекратить указывать поставщика и используйте реализацию по умолчанию.

Так что в вашем случае избавьтесь от спецификации поставщика:

JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
...