Crash Casting AndroidKeyStoreRSAPrivateKey zu RSAPrivateKey

Ich folge diesem Tutorial:Wie verwende ich den Android Keystore zum Speichern von Passwörtern und anderen vertraulichen Informationen?. Es ist (lose) mit der Google-Beispiel-App verknüpft: BasicAndroidKeyStore.

Ich kann meine Daten mit dem öffentlichen Schlüssel verschlüsseln und auf Geräten, auf denen Lollipop ausgeführt wird, entschlüsseln. Allerdings habe ich einen Nexus 6 mit Marshmallow und dieser stürzt ab und gibt den Fehler aus:

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

Hier ist der Code, auf dem es abstürzt:

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

Ich zögere es, dies auf eine Android M-Kuriosität zurückzuführen, da ich keinen Grund sehe, warum sich die Java-Kryptobibliotheken geändert hätten. Wenn die M-Version erscheint und unsere App sofort auf M abstürzt, bekomme ich große Probleme.

Ich mache etwas falsch? Der Fehler besagt ganz konkret, dass Sie nicht auf RSAPrivateKey übertragen können. Kennt also jemand einen besseren Weg, um den RSAPrivateKey aus dem Eintrag zu erhalten?

Vielen, vielen Dank

Antworten auf die Frage(8)

Ihre Antwort auf die Frage