2017-05-26 20 views
1

暗号化にRSAアルゴリズムを使用するチャットアプリケーションを作成しようとしています。後で私はメッセージを解読しようとすると、私はこのエラーが発生しています。KeyStoreから秘密鍵を取得できません

ここで私はどのようにキーを作成していますか?

if (!keyStore.containsAlias(alias)) { 
       Calendar start = Calendar.getInstance(); 
       Calendar end = Calendar.getInstance(); 
       end.add(Calendar.YEAR, 25); 
       KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(getApplicationContext()) 
         .setAlias(alias) 
         .setSubject(new X500Principal("CN=Sample Name, O=Android Authority")) 
         .setSerialNumber(BigInteger.ONE) 
         .setStartDate(start.getTime()) 
         .setEndDate(end.getTime()) 
         .build(); 
       KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore"); 
       generator.initialize(spec); 

      } 

次に、メッセージを復号化する方法を示します。

定義キーストア。 onCreateメソッド内

static KeyStore keyStore; 

ロードストア:

try{ 
     keyStore = KeyStore.getInstance("AndroidKeyStore"); 
     keyStore.load(null); 
    } 
    catch (CertificateException | NoSuchAlgorithmException | KeyStoreException | IOException e) { 
     e.printStackTrace(); 
    } 

復号化機能:

 public String decryptString(String alias, String decrypted) { 
    try { 

     KeyStore.Entry entry; 
     //ERROR HAPPENS HERE. 
     entry = keyStore.getEntry(alias, null); 

     KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) entry; 

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


     CipherInputStream cipherInputStream = new CipherInputStream(
       new ByteArrayInputStream(Base64.decode(decrypted, Base64.DEFAULT)), output); 
     ArrayList<Byte> values = new ArrayList<>(); 
     int nextByte; 
     while ((nextByte = cipherInputStream.read()) != -1) { 
      values.add((byte) nextByte); 
     } 

     byte[] bytes = new byte[values.size()]; 
     for (int i = 0; i < bytes.length; i++) { 
      bytes[i] = values.get(i); 
     } 

     String finalText = new String(bytes, 0, bytes.length, "UTF-8"); 
     return finalText; 

    } catch (IOException | KeyStoreException | NoSuchPaddingException | UnrecoverableEntryException | InvalidKeyException | NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } 
    return "Error"; 
} 

私は下のこのエラーを取得しています。

E/AndroidRuntime: FATAL EXCEPTION: main 
                   Process: com.furkan.profil, PID: 10591 
                   java.lang.NullPointerException: Attempt to invoke virtual method 'java.security.KeyStore$Entry java.security.KeyStore.getEntry(java.lang.String, java.security.KeyStore$ProtectionParameter)' on a null object reference 
                    at com.furkan.profil.RSAHelper.decryptString(RSAHelper.java:180) 
                    at com.furkan.profil.Chat.ChatActivity$4.onChildAdded(ChatActivity.java:251) 
                    at com.google.android.gms.internal.zzblz.zza(Unknown Source) 
                    at com.google.android.gms.internal.zzbnz.zzYj(Unknown Source) 
                    at com.google.android.gms.internal.zzboc$1.run(Unknown Source) 
                    at android.os.Handler.handleCallback(Handler.java:739) 
                    at android.os.Handler.dispatchMessage(Handler.java:95) 
                    at android.os.Looper.loop(Looper.java:148) 
                    at android.app.ActivityThread.main(ActivityThread.java:5417) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+0

これで変更しました。ただし、テーブルの下にキーストアを作成する例外をシャッフルしています(空のキャッチブロック、代わりに 'IllegalStateException'を使用します)。例外が発生した行を指定せず、最後に例外が発生したようです。 –

+0

いいえ、私は最後のものが間違っています。おそらくあなたは[(パスワード)コールバックハンドラ]を作成して設定する必要があります(https://developer.android.com/reference/javax/security/auth/callback/CallbackHandler .html)。 –

+0

Android Studioが私に提供した他のcatch節を追加しました。例外の発生箇所も編集しました。私はまだ同じエラーが発生しています。 なぜコールバックハンドラーを使用したいのですか?私に説明してもらえますか? –

答えて

0

私はちょうど私が別のアクティビティからこのメソッドにアクセスしていると私は、メソッドにアクセスしようとすると、これは私がのonCreate()メソッドをトリガーするわけではないことに気付きました。追加した;

try{ 
      keyStore = KeyStore.getInstance("AndroidKeyStore"); 
      keyStore.load(null); 
     } catch (CertificateException | NoSuchAlgorithmException | KeyStoreException | IOException e) { 
      throw new IllegalStateException("KeyStore could not be initialized", e); 
     } 

decryptString()メソッドへの行。その後、私の問題は解決されます。

関連する問題