私はこのチュートリアルに従っています: How to use the Android Keystore to store passwords and other sensitive information . これは (大まかに) 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);
Java暗号ライブラリが変更された理由が見当たらないので、これをAndroid Mの奇妙さに分類するのは気が進まない. M のリリースが近づいてきて、アプリがすぐに M でクラッシュした場合、私は大変なことになります。
私は何か間違ったことをしていますか?このエラーは、RSAPrivateKey にキャストできないことを明確に示しているため、エントリから RSAPrivateKey を取得するより良い方法を知っている人はいますか?
大変感謝します。