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);