Я следую этому руководству: Как использовать Android Хранилище ключей для хранения паролей и другой конфиденциальной информации. Оно (условно) связано с примером приложения Google: BasicAndroidKeyStore.
Я могу зашифровать свои данные с помощью открытого ключа и расшифровать на устройствах с Lollipop. Однако у меня есть Nexus 6, работающий с зефиром, и он вылетает, выдавая ошибку:
java.lang.RuntimeException: Unable to create application com.android.test: java.lang.ClassCastException: android.security.keystore.AndroidKeyStoreRSAPrivateKey cannot be cast to java.security.interfaces.RSAPrivateKey
Вот код, на котором происходит сбой:
KeyStore.Entry entry;
//Get Android KeyStore
ks = KeyStore.getInstance(KeystoreHelper.KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
// Weird artifact of Java API. If you don't have an InputStream to load, you still need to call "load", or it'll crash.
ks.load(null);
// Load the key pair from the Android Key Store
entry = ks.getEntry(mAlias, null);
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) entry;
//ERROR OCCURS HERE::
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) privateKeyEntry.getPrivateKey();
Cipher output = Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL");
output.init(Cipher.DECRYPT_MODE, rsaPrivateKey);
Я не хочу списывать это на странность Android M, поскольку не вижу причин, по которым криптографические библиотеки Java изменились бы. Если появится версия M, и наше приложение сразу же выйдет из строя на M, у меня будут большие проблемы.
Я делаю что-то не так? В ошибке очень конкретно говорится, что вы не можете выполнить преобразование в RSAPrivateKey, поэтому кто-нибудь знает лучший способ получить RSAPrivateKey из записи?
Большое большое спасибо.