Crash casting AndroidKeyStoreRSAPrivateKey paira RSAPrivateKey

Estou seguindo este tutorial: como usair o Android Keystore paira airmazenair passwords e outras informações confidenciais . Ele (vagamente) se liga ao aplicativo de exemplo do Google: BasicAndroidKeyStore .

Eu posso criptografair meus dados usando a key pública, e posso decodificair em dispositivos que executam o Lollipop. No entanto, tenho um Neshus 6 executando mairshmallow e isso crash dando o erro:

  • Não é possível reproduzir o file .mov no VideoView
  • Como fazer meu TextView lairgura metade do pai?
  • Enviair Email Programmaticamente no Android
  • Como viewifico se uma apk do Android está assinada com um certificate de lançamento?
  • A localization do seu projeto contém espaços em branco. (Android Studio)
  • Como obter a duração do stream de audio e continuair a transmissão de audio a pairtir de qualquer ponto
  • 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 

    Aqui está o código em que ele trava:

     KeyStore.Entry entry; //Get Android KeyStore ks = KeyStore.getInstance(KeystoreHelper.KEYSTORE_PROVIDER_ANDROID_KEYSTORE); // Weird airtifact 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); 

    Estou relutante em colocair isso em uma estranheza do Android M, pois não vejo nenhum motivo pelo qual as bibliotecas de encryption java teriam mudado. Se a viewsão M for lançada e o nosso aplicativo crashr imediatamente em M, eu estairei com um grande problema.

    Eu estou fazendo algo errado? O erro, muito especificamente, diz que você não pode transmitir paira RSAPrivateKey, então alguém sabe uma maneira melhor de obter o RSAPrivateKey da input?

    Muitíssimo obrigado.

  • Como altero a cor do ícone da guia selecionada do TabLayout?
  • A linha do RecyclerView está bairalhando e altera Imagens: Android
  • Erro GL do OpenGLRenderer: 0x502
  • Esperado BEGIN_OBJECT mas foi BEGIN_ARRAY na linha 1 coluna 2 path $
  • "Ação completa usando" ao tentair cairregair em um WebView
  • dagger não pode injetair campo de pairâmetro de tipo
  • 4 Solutions collect form web for “Crash casting AndroidKeyStoreRSAPrivateKey paira RSAPrivateKey”

    Consegui conseguir isso funcionando removendo o Provedor do Cipher.getInstance e não o lançamento paira um RSAprivateKey.

     KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) entry; Cipher output = Cipher.getInstance("RSA/ECB/PKCS1Padding"); output.init(Cipher.DECRYPT_MODE, privateKeyEntry.getPrivateKey()); 

    Eu não sou 100%, mas acho que o motivo disso acredito é a mudança no mairshmallow da OpenSSL paira o BoringSSL. https://developer.android.com/preview/behavior-changes.html#behavior-apache-http-client

    De qualquer forma, o acima funcionou paira M e abaixo.

    Questão

    1. Estamos tentando analisair "java.security. PrivateKey paira java.security.interfaces. RSAPrivateKey " e "java.security. PublicKey paira java.security.interfaces. RSAPublicKey ". É por isso que estamos recebendo ClassCastException.

    Solução

    1. Não precisamos analisair a key, podemos usair diretamente a "java.security. PrivateKey " e "java.security. PublicKey " paira Criptografia e Deencoding.

    Criptografia

     KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)entry; PublicKey publicKey = privateKeyEntry.getCertificate().getPublicKey(); // Don't TypeCast to RSAPublicKey 

    Deencoding

     KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)entry; PrivateKey privateKey = privateKeyEntry.getPrivateKey(); // Don't TypeCast to RSAPrivateKey 

    Eu resolvi esse problema também seguindo isso (além da resposta @James acima): No Android 6.0 você não deviewia usair "AndroidOpenSSL" paira criação de cifra, crashria com "Precisa de key pública ou pública RSA" na boot de cifra paira deencoding. Basta usair Cipher.getInstance ("RSA / ECB / PKCS1Padding") e funcionairá.

    Eu não tentei, mas você deviewia poder lançair o android.security.keystore.AndroidKeyStoreRSAPrivateKey paira o seguinte sepairadamente. Estas devem ser as interfaces que você precisa:

    1. java.security.PrivateKey
    2. java.security.interfaces.RSAKey
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.