2016-03-20 15 views
4

Ich versuche, ein Cipher-Objekt für die Verschlüsselung und Entschlüsselung zu initialisieren.AndroidKeystore NoSuchAlgorithm Ausnahme

String cipher = privateKey.getAlgorithm() + "/ECB/PKCS1Padding"; 
     mCipher = Cipher.getInstance(cipher, "AndroidKeyStore"); 

Ich halte die folgende Ausnahme auf Android bekommen:

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) 

Antwort

7

bei Google nach es einen Fehler in BouncyCastle ist, die sie von der Installation von ihrem Provider normalerweise verhindert, so verwendet sie den Namen des Anbieters AndroidKeyStoreBCWorkaround bei der Installation Algorithmen in Bezug auf AndroidKeyStore-Schlüssel. See AOSP source here.

Der folgende Code wird auf KitKat durch Eibisch laufen, aber ich würde es nicht empfehlen, da Google sagt, dass sie die Arbeit herum beseitigen, wenn es nicht mehr benötigt wird:

Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidKeyStoreBCWorkaround"); 

Stattdessen verwenden

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

arbeitete für mich, dank – issamux

+1

@ DAC84 eine neue Frage mit logcat, stacktrace und Code-Schnipsel Fragen Sie: der private Schlüssel die Chiffre, die Cipher-Klasse findet die richtigen kompatibel Cipher zu bekommen. – satur9nine