2016-08-08 3 views
-3

В данном коде используется шифрование AES с 128-битным значением ключа, заданным пользователем. Я использовал этот код в своем проекте для Android, но следующий код шифруется должным образом, но во время дешифрования он показывает исключение (ошибка в расшифровке) и приводит к, к сожалению, остановке приложения. Вот следующий код,Ошибка в расшифровке AES

import android.util.Base64; 
import android.util.Log; 
import java.io.UnsupportedEncodingException; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import java.util.Arrays; 
import javax.crypto.Cipher; 
import javax.crypto.spec.SecretKeySpec; 


public class AES { 

    static final String TAG = "SymmetricAlgorithmAES"; 

    private SecretKeySpec secretKey; 
    private byte[] key; 

    private String decryptedString; 
    private String encryptedString; 

    //Sets the value of the key 
    public void setKey(String myKey) { 

     MessageDigest sha = null; 
     try { 
      key = myKey.getBytes("UTF-8"); 
      sha = MessageDigest.getInstance("SHA-1"); 
      key = sha.digest(key); 

      key = Arrays.copyOf(key, 16); 
      secretKey = new SecretKeySpec(key, "AES"); 
     } catch (UnsupportedEncodingException e) { 
      // TODO Auto-generated catch block 
      Log.e(TAG, "Error in setting the key"); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } 
    } 

    public SecretKeySpec getKey(){ 
     return secretKey; 
    } 

    public String getDecryptedString() { 
     return decryptedString; 
    } 

    public void setDecryptedString(String decryptedString) { 
     this.decryptedString = decryptedString; 
    } 

    public String getEncryptedString() { 
     return encryptedString; 
    } 

    public void setEncryptedString(String encryptedString) { 
     this.encryptedString = encryptedString; 
    } 

    //Method for Encryption 
    public void encrypt(String strToEncrypt) { 
     try { 
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
      cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
      byte[] encd = cipher.doFinal(strToEncrypt.getBytes("UTF-8")); 
      byte[] cc =Base64.encode(encd,Base64.DEFAULT); 
      setEncryptedString(new String(cc));   
     } catch (Exception e) { 
      Log.e(TAG, "Error in Encryption"); 
     } 
    } 

    //Method for Decryption 
    public void decrypt(String strToDecrypt) { 
     byte[] decd = null; 
     try { 
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING"); 
      cipher.init(Cipher.DECRYPT_MODE, secretKey); 
      decd = cipher.doFinal(strToDecrypt.getBytes("UTF-8")); 

     } catch (Exception e) { 
      Log.e(TAG, "Error in Decryption" + decd); 
     } 
     setDecryptedString(decd.toString()); 
    } 
} 

Здесь представлен LogCat

08-10 12:27:23.187 30907-30907/com.test.encryptiontest E/SymmetricAlgorithmAES: Error in Decryptionnull 
08-10 12:27:23.189 30907-30907/com.test.encryptiontest E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.test.encryptiontest, PID: 30907 
    java.lang.IllegalStateException: Could not execute method for android:onClick 
     at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) 
     at android.view.View.performClick(View.java:5198) 
     at android.view.View$PerformClick.run(View.java:21147) 
     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) 
     Caused by: java.lang.reflect.InvocationTargetException 
     at java.lang.reflect.Method.invoke(Native Method) 
     at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
     at android.view.View.performClick(View.java:5198)  
     at android.view.View$PerformClick.run(View.java:21147)  
     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)  
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference 
     at com.test.encryptiontest.AES.decrypt(AES.java:86) 
     at com.test.encryptiontest.Decode.decode(Decode.java:23) 
     at java.lang.reflect.Method.invoke(Native Method)  
     at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)  
     at android.view.View.performClick(View.java:5198)  
     at android.view.View$PerformClick.run(View.java:21147)  
     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)  


                     --------- beginning of system 
+1

Итак, вы надеялись, что мы сможем догадаться, какова ваша ошибка, откуда она была выбрана, и как ее исправить. У меня есть это право? – shmosel

+1

Привет. Во-первых, постарайтесь сделать ваши вопросы более описательными. Во-вторых, можете ли вы поместить 'e.printStackTrace()' в свои блоки исключений, затем [изменить] вопрос с помощью logcat? –

+1

Вы забыли декодировать строку в кодировке Base64, прежде чем пытаться ее расшифровать. –

ответ

-1

Попробуйте записать код

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING"); 
cipher.init(Cipher.DECRYPT_MODE, secretKey); 
decd = cipher.doFinal(strToDecrypt.getBytes("UTF-8")); 

один за другим, и посмотреть, какие строки генерирует исключение.

+0

Я думаю, что строка cipher.init (Cipher.DECRYPT_MODE, secretKey); вызывает ошибку. – Soumyajit

+0

@SoumyajitGorai Пожалуйста, добавьте полное исключение stacktrace к вашему вопросу, чтобы мы могли перестать гадать. Но было бы очень странно, если бы проблема была в этой строке. –

+0

@ ArtjomB.i не знал, что – kommradHomer

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