2016-03-20 7 views
4

暗号化と復号化のためにCipherオブジェクトを初期化しようとしています。AndroidKeystore NoSuchAlgorithm例外

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

私はAndroid上で次の例外を取得しておいてください。

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) 

答えて

7

では、Googleによると、通常はそのプロバイダをインストールするからそれらを防ぐことはBouncyCastleでのバグがありますので、インストール時に、彼らは、プロバイダ名AndroidKeyStoreBCWorkaroundを使用AndroidKeyStoreキーに関連するアルゴリズムSee AOSP source here.

次のコードは、マシュマロを通じてキットカット上で実行されますが、Googleはもはや必要とされていない場合、彼らは、周りの仕事排除すると言うので、私はそれをお勧めしません。代わりに使用

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

を秘密鍵暗号を取得するには、暗号クラスが正しい互換性のある暗号見つける:

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

はDAC84 @おかげ – issamux

+1

はlogcat、スタックトレースとコードスニペットで新しい質問を、私のために働きました。 – satur9nine