2015-02-23 2 views
0

Я взял ссылку на эту статью для Simple ENCRYPTION,простое шифрование в андроида

Я беру текст в EditText, а затем принимать ключ от пользователя с помощью диалогового окна пользовательского, а затем создать его, как указано в статье, шифрование исходного текста , дешифруя его и показывая его в Textview на экране ... но после запуска исключения отображаются в logcat, как описано в коде. Это очень просто, но я новичок в android и java, столкнувшись с трудностями. Возможно, я чувствую, что делаю ошибка в переменной мимоходом

Java код

package com.example.encryptiondecryption; 

    import java.security.SecureRandom; 

    import javax.crypto.Cipher; 
    import javax.crypto.KeyGenerator; 
    import javax.crypto.spec.SecretKeySpec; 
    import android.app.Activity; 
    import android.app.Dialog; 
    import android.content.Context; 
    import android.os.Bundle; 
    import android.util.Base64; 
    import android.util.Log; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.TextView; 

    public class MainActivity extends Activity implements OnClickListener { 

     static final String TAG = "SymmetricAlgorithmAES"; 
     static final String TAG1 = "encccccccc"; 
     EditText getData_edt, key_edt; 
     Button genkey_btn, encrypt_btn, decrypt_btn; 
     static String key_str = null; 
     static String getData_str = null; 

     static SecretKeySpec sks = null; 
     static byte[] encodedBytes = null; 

     static byte[] decodedBytes = null; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      getData_edt = (EditText) (findViewById(R.id.am_input_edt)); 
      genkey_btn = (Button) (findViewById(R.id.am_key_btn)); 
      encrypt_btn = (Button) (findViewById(R.id.am_encrypt_btn)); 
      decrypt_btn = (Button) (findViewById(R.id.am_decrypt_btn)); 
      getData_str = getData_edt.getText().toString(); 

      genkey_btn.setOnClickListener(this); 
      encrypt_btn.setOnClickListener(this); 
      decrypt_btn.setOnClickListener(this); 

     } 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      switch (v.getId()) { 

      case R.id.am_key_btn: 
       genKey(sks); 

       break; 
      case R.id.am_encrypt_btn: 
       encrypt(sks); 

       break; 
      case R.id.am_decrypt_btn: 
       decrypt(); 

       break; 

      default: 
       break; 
      } 

     } 

     private void genKey(SecretKeySpec sks) { 
      // TODO Auto-generated method stub 
      Context context = this; 
      final Dialog myDialog = new Dialog(context); 

      myDialog.setContentView(R.layout.dialog); 

      myDialog.setTitle("enter key"); 

      key_edt = (EditText) myDialog.findViewById(R.id.dg_key_tv); 
      Button ok_btn = (Button) myDialog.findViewById(R.id.dg_ok_btn); 
      Button cancel_btn = (Button) myDialog.findViewById(R.id.dg_cancel_btn); 

      Log.d(TAG1, key_str); 

      ok_btn.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 

        key_str = key_edt.getText().toString(); 

       } 
      }); 
      try { 
       SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); 
       sr.setSeed(key_str.getBytes()); 

       KeyGenerator kg = KeyGenerator.getInstance("AES"); 
       kg.init(128, sr); 
       sks = new SecretKeySpec((kg.generateKey()).getEncoded(), "AES"); 
       Log.i("encrypt", sks.toString()); 

      } catch (Exception e) { 
       Log.e(TAG, "AES secret key spec error"); 
      } 
      cancel_btn.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        myDialog.dismiss(); 
       } 
      }); 
      myDialog.show(); 

     } 

     private void encrypt(SecretKeySpec sks) { 
      // TODO Auto-generated method stub 

      try { 
       Cipher c = Cipher.getInstance("AES"); 
       c.init(Cipher.ENCRYPT_MODE, sks); 
       encodedBytes = c.doFinal(getData_str.getBytes()); 
       String encoded = Base64 
         .encodeToString(encodedBytes, Base64.DEFAULT); 
       System.out.println(" " + encoded); 
      } catch (Exception e) { 
       Log.e(TAG, "AES encryption error"); 
      } 
     } 

     private void decrypt() { 
      // TODO Auto-generated method stub 

      try { 
       Cipher c = Cipher.getInstance("AES"); 
       c.init(Cipher.DECRYPT_MODE, sks); 
       decodedBytes = c.doFinal(encodedBytes); 
       System.out.println(" " + new String(decodedBytes)); 

      } catch (Exception e) { 
       Log.e(TAG, "AES decryption error"); 
       TextView tvdecoded = (TextView) findViewById(R.id.am_show_tv); 
       tvdecoded.setText("DECOD\n" + new String(decodedBytes) + "\n"); 
      } 
     } 
    } 

XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.encryptiondecryption.MainActivity" > 

    <EditText 
     android:id="@+id/am_input_edt" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 


     android:ems="10" 
     android:inputType="textMultiLine" /> 

    <Button 
     android:id="@+id/am_key_btn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/am_input_edt" 
     android:layout_below="@+id/am_input_edt" 
     android:text="enter your key" /> 

    <Button 
     android:id="@+id/am_encrypt_btn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@id/am_key_btn" 
     android:layout_below="@+id/am_key_btn" 
     android:text="Encrypt" /> 

    <Button 
     android:id="@+id/am_decrypt_btn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@id/am_encrypt_btn" 
     android:layout_below="@+id/am_encrypt_btn" 
     android:text="Decrypt" /> 

    <TextView 
     android:id="@+id/am_show_tv" 
     android:layout_width="match_parent" 
     android:layout_height="40dp" 
     android:layout_alignLeft="@+id/am_decrypt_btn" 
     android:layout_below="@+id/am_decrypt_btn" 
     android:layout_marginTop="15dp" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

</RelativeLayout> 

XML макет диалогового окна для ...

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <EditText 
     android:id="@+id/dg_key_tv" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:ems="10" > 

     <requestFocus /> 
    </EditText> 

<Button 
    android:id="@+id/dg_ok_btn" 
    android:layout_width="61dp" 
    android:layout_height="wrap_content" 
    android:text="Ok" /> 

<Button 
    android:id="@+id/dg_cancel_btn" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="cancel" 
    /> 

ошибка Logcat

02-23 23:50:17.245: E/SymmetricAlgorithmAES(12735): AES secret key spec error 
02-23 23:50:17.245: W/System.err(12735): java.lang.NullPointerException 
02-23 23:50:17.265: W/System.err(12735): at com.example.encryptiondecryption.MainActivity.genKey(MainActivity.java:99) 
02-23 23:50:17.265: W/System.err(12735): at com.example.encryptiondecryption.MainActivity.onClick(MainActivity.java:56) 
02-23 23:50:17.265: W/System.err(12735): at android.view.View.performClick(View.java:4439) 
02-23 23:50:17.265: W/System.err(12735): at android.widget.Button.performClick(Button.java:139) 
02-23 23:50:17.265: W/System.err(12735): at android.view.View$PerformClick.run(View.java:18395) 
02-23 23:50:17.265: W/System.err(12735): at android.os.Handler.handleCallback(Handler.java:725) 
02-23 23:50:17.265: W/System.err(12735): at android.os.Handler.dispatchMessage(Handler.java:92) 
02-23 23:50:17.265: W/System.err(12735): at android.os.Looper.loop(Looper.java:176) 
02-23 23:50:17.265: W/System.err(12735): at android.app.ActivityThread.main(ActivityThread.java:5317) 
02-23 23:50:17.265: W/System.err(12735): at java.lang.reflect.Method.invokeNative(Native Method) 
02-23 23:50:17.265: W/System.err(12735): at java.lang.reflect.Method.invoke(Method.java:511) 
02-23 23:50:17.265: W/System.err(12735): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
02-23 23:50:17.265: W/System.err(12735): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
02-23 23:50:17.265: W/System.err(12735): at dalvik.system.NativeStart.main(Native Method) 
02-23 23:50:21.579: E/ViewRootImpl(12735): sendUserActionEvent() mView == null 
02-23 23:50:23.491: E/SymmetricAlgorithmAES(12735): AES encryption error 
02-23 23:50:24.932: E/SymmetricAlgorithmAES(12735): AES decryption error 
02-23 23:50:24.932: W/System.err(12735): java.lang.NullPointerException 
02-23 23:50:24.942: W/System.err(12735): at com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineInit(BaseBlockCipher.java:385) 
02-23 23:50:24.942: W/System.err(12735): at com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineInit(BaseBlockCipher.java:625) 
02-23 23:50:24.952: W/System.err(12735): at javax.crypto.Cipher.init(Cipher.java:519) 
02-23 23:50:24.952: W/System.err(12735): at javax.crypto.Cipher.init(Cipher.java:479) 
02-23 23:50:24.952: W/System.err(12735): at com.example.encryptiondecryption.MainActivity.decrypt(MainActivity.java:141) 
02-23 23:50:24.952: W/System.err(12735): at com.example.encryptiondecryption.MainActivity.onClick(MainActivity.java:64) 
02-23 23:50:24.952: W/System.err(12735): at android.view.View.performClick(View.java:4439) 
02-23 23:50:24.952: W/System.err(12735): at android.widget.Button.performClick(Button.java:139) 
02-23 23:50:24.952: W/System.err(12735): at android.view.View$PerformClick.run(View.java:18395) 
02-23 23:50:24.952: W/System.err(12735): at android.os.Handler.handleCallback(Handler.java:725) 
02-23 23:50:24.952: W/System.err(12735): at android.os.Handler.dispatchMessage(Handler.java:92) 
02-23 23:50:24.952: W/System.err(12735): at android.os.Looper.loop(Looper.java:176) 
02-23 23:50:24.952: W/System.err(12735): at android.app.ActivityThread.main(ActivityThread.java:5317) 
02-23 23:50:24.952: W/System.err(12735): at java.lang.reflect.Method.invokeNative(Native Method) 
02-23 23:50:24.952: W/System.err(12735): at java.lang.reflect.Method.invoke(Method.java:511) 
02-23 23:50:24.952: W/System.err(12735): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
02-23 23:50:24.952: W/System.err(12735): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
02-23 23:50:24.952: W/System.err(12735): at dalvik.system.NativeStart.main(Native Method) 
02-23 23:50:24.952: D/AndroidRuntime(12735): Shutting down VM 
02-23 23:50:24.952: W/dalvikvm(12735): threadid=1: thread exiting with uncaught exception (group=0x412b3930) 
02-23 23:50:24.962: E/AndroidRuntime(12735): FATAL EXCEPTION: main 
02-23 23:50:24.962: E/AndroidRuntime(12735): java.lang.NullPointerException 
02-23 23:50:24.962: E/AndroidRuntime(12735): at java.lang.String.<init>(String.java:141) 
02-23 23:50:24.962: E/AndroidRuntime(12735): at com.example.encryptiondecryption.MainActivity.decrypt(MainActivity.java:148) 
02-23 23:50:24.962: E/AndroidRuntime(12735): at com.example.encryptiondecryption.MainActivity.onClick(MainActivity.java:64) 
02-23 23:50:24.962: E/AndroidRuntime(12735): at android.view.View.performClick(View.java:4439) 
02-23 23:50:24.962: E/AndroidRuntime(12735): at android.widget.Button.performClick(Button.java:139) 
02-23 23:50:24.962: E/AndroidRuntime(12735): at android.view.View$PerformClick.run(View.java:18395) 
02-23 23:50:24.962: E/AndroidRuntime(12735): at android.os.Handler.handleCallback(Handler.java:725) 
02-23 23:50:24.962: E/AndroidRuntime(12735): at android.os.Handler.dispatchMessage(Handler.java:92) 
02-23 23:50:24.962: E/AndroidRuntime(12735): at android.os.Looper.loop(Looper.java:176) 
02-23 23:50:24.962: E/AndroidRuntime(12735): at android.app.ActivityThread.main(ActivityThread.java:5317) 
02-23 23:50:24.962: E/AndroidRuntime(12735): at java.lang.reflect.Method.invokeNative(Native Method) 
02-23 23:50:24.962: E/AndroidRuntime(12735): at java.lang.reflect.Method.invoke(Method.java:511) 
02-23 23:50:24.962: E/AndroidRuntime(12735): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
02-23 23:50:24.962: E/AndroidRuntime(12735): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
02-23 23:50:24.962: E/AndroidRuntime(12735): at dalvik.system.NativeStart.main(Native Method) 
+0

размещаете ошибки из LogCat – Yazan

+0

@Yazan разместил наконец ... – user3519331

+0

, где когда-либо использовать log.e, а также использовать printStacktrace() за исключением, это покажет фактическую ошибку, e.printStacktrace() будет более полезной.теперь ваш журнал говорит, что что-то не так случилось с генерацией ключа, поэтому используйте 'printStacktrace' и опубликуйте ошибку – Yazan

ответ

0

Я думаю, что одна из ваших проблем является непонимание того, что происходит, когда вы передаете объект к методу. Внутри метода вы можете изменить объект параметра, вызвав его методы, но вы не можете присвоить ему значение и ожидать, что он каким-либо образом повлияет на код вызова. Более подробную информацию об этом, читайте: Is Java "pass-by-reference" or "pass-by-value"?

Это заставило вас проблемы в вашей ключевой метод генерации, где вы проходите в вашей sks области и надеемся, что следующий код будет изменить значение поля:

sks = new SecretKeySpec((kg.generateKey()).getEncoded(), "AES"); 

Вместо этого это влияет только на значение параметра параметра local. Он не влияет на ваше поле sks. Чтобы устранить эту проблему, присвоить полю непосредственно:

this.sks = new SecretKeySpec((kg.generateKey()).getEncoded(), "AES"); 

Вы можете настроить метод, так что он не требует параметра:

private void genKey() { 
    // .... 
} 
+0

thnx для ценного предложения ... не в состоянии запустить код .. но очень ясно сейчас ... – user3519331

0

Как другой ответ указывает, ваш sks Область видимости переменной должна быть целым классом, а не только методом genkey(). Однако в этом методе есть еще одна ошибка, вызывающая ошибку spec. Он создает диалоговое окно и добавляет слушателя к кнопке OK, но затем пытается создать ключ тогда и там (пока TextView все еще пуст). Код генерации должен быть частью прослушивателя кликов.

private void genKey() { 
     // TODO Auto-generated method stub 
     Context context = this; 
     final Dialog myDialog = new Dialog(context); 

     myDialog.setContentView(R.layout.dialog); 

     myDialog.setTitle("enter key"); 

     key_edt = (EditText) myDialog.findViewById(R.id.dg_key_tv); 
     Button ok_btn = (Button) myDialog.findViewById(R.id.dg_ok_btn); 
     Button cancel_btn = (Button) myDialog.findViewById(R.id.dg_cancel_btn); 

     Log.d(TAG1, key_str); 

     ok_btn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       key_str = key_edt.getText().toString(); 

       // only try to create the Key Spec now we have our key string 
       // first check to make sure it's not blank 
       if(key_str != null && !key_str.isEmpty()){ 
        try { 
         SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); 
         sr.setSeed(key_str.getBytes()); 

         KeyGenerator kg = KeyGenerator.getInstance("AES"); 
         kg.init(128, sr); 
         this.sks = new SecretKeySpec((kg.generateKey()).getEncoded(), "AES"); 
         Log.i("encrypt", sks.toString()); 

        } catch (Exception e) { 
         Log.e(TAG, "AES secret key spec error"); 
        } 
       } 
       else{ // string is empty 
        // make some toast to alert user 
       } 
      } 
     }); 

     cancel_btn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       myDialog.dismiss(); 
      } 
     }); 
     myDialog.show(); 

    } 

Пожалуйста, обратите внимание, что это должно хранить KeySpec в качестве переменной класса с помощью this.sks. В противном случае это будет сбор мусора после завершения клика. Ваши функции шифрования и дешифрования должны использовать эту переменную класса для выполнения своей работы и показывать тост или что-то еще, если ключ еще не создан.

Например с encrypt() способом:

private void encrypt() { 
    if (this.sks == null){ 
     // make toast and tell user to generate the key 
    } else { 
     try { 
      Cipher c = Cipher.getInstance("AES"); 
      // use the class key spec to encrypt 
      c.init(Cipher.ENCRYPT_MODE, this.sks); 
      encodedBytes = c.doFinal(getData_str.getBytes()); 
      String encoded = Base64 
        .encodeToString(encodedBytes, Base64.DEFAULT); 
      System.out.println(" " + encoded); 
     } catch (Exception e) { 
      Log.e(TAG, "AES encryption error"); 
     } 
    } 
} 
+0

Я старался согласно вашему предложению ... но когда я пытаюсь вставить код в код для кликов, он снова говорит: создайте поле keypec в методе перечислителя щелчка ... почему, когда я объявляю его глобально, будет ли он снова работать с моим кодом ...? .. также расскажите, как использовать ту же объявленную переменную ключа ключа в методе шифрования и дешифрования ... я так смущен, пожалуйста, помогите – user3519331

+0

Когда вы говорите: «Это снова говорит, чтобы создать поле keypec в методе перечислимого щелчка», вы действительно получаете журнал ошибок или что-то, что вам это говорит? Если да, сообщите об этом в свой вопрос. Вы создаете его в методе onClickListener, это для кнопки OK в вашем всплывающем диалоговом окне. Что касается того, как использовать его в методах шифрования и дешифрования, я отредактировал свой ответ, чтобы привести пример. Когда вы создаете ключ, он должен быть сохранен как переменная экземпляра класса, чтобы он мог использоваться всеми методами. Если вы этого не сделаете, он будет уничтожен, как только ваш метод закончится. –

Смежные вопросы