AndroidKeystore NoSuchAlgorithm исключение

Я пытаюсь инициализировать объект шифрования для шифрования и дешифрования.

String cipher = privateKey.getAlgorithm() + "/ECB/PKCS1Padding";
        mCipher = Cipher.getInstance(cipher, "AndroidKeyStore");

Я продолжаю получать следующее исключение на Android:

    System.err: java.security.NoSuchAlgorithmException: Provider   AndroidKeyStore does not provide RSA/ECB/PKCS1Padding
   03-20 00:28:38.270 19817 21488 W System.err:     at javax.crypto.Cipher.getCipher(Cipher.java:357)
   03-20 00:28:38.270 19817 21488 W System.err:     at javax.crypto.Cipher.getInstance(Cipher.java:325)
   03-20 00:28:38.271 19817 21488 W System.err:     at javax.crypto.Cipher.getInstance(Cipher.java:297)

1 ответ

По словам Google, в BouncyCastle есть ошибка, которая не позволяла им нормально устанавливать поставщика, поэтому они использовали имя поставщика. AndroidKeyStoreBCWorkaround при установке алгоритмов, связанных с ключами AndroidKeyStore. Посмотрите источник AOSP здесь.

Следующий код будет запускаться на KitKat через Marshmallow, но я не рекомендую его, поскольку Google заявляет, что они устранят обходной путь, когда он больше не нужен:

Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidKeyStoreBCWorkaround");

Вместо этого используйте закрытый ключ для получения Cipher, класс Cipher найдет правильный совместимый Cipher:

KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);

KeyStore.PrivateKeyEntry keyEntry = 
        (KeyStore.PrivateKeyEntry) ks.getEntry("mykeypair", null);
PrivateKey privKey = keyEntry.getPrivateKey();

Cipher c = Cipher.getInstance("RSA/ECB/PKCS1Padding");
c.init(Cipher.ENCRYPT_MODE, privKey);
byte[] cipherText = c.doFinal(clearText, 0, clearText.length);
Другие вопросы по тегам