2014-01-10 9 views
2

문자열을 암호화하고 해독하는 안드로이드 응용 프로그램을 만들고 있습니다. 암호 알고리즘을 사용하고 있는데 응용 프로그램이 암호로 잘 작동하지만 시스템을 해독하려고하면 오류가 표시됩니다 :암호 알고리즘으로 암호 해독

01-10 09:50:54.364: E/AndroidRuntime(602): Caused by: javax.crypto.IllegalBlockSizeException: last block incomplete in decryption 

누구든지이 오류를 해결하는 데 도움이 될 수 있습니까 ??

코드

package com.devleb.encdecapp; 

import java.io.UnsupportedEncodingException; 
import java.security.GeneralSecurityException; 
import java.security.SecureRandom; 

import javax.crypto.Cipher; 
import javax.crypto.KeyGenerator; 
import javax.crypto.SecretKey; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.PBEKeySpec; 
import javax.crypto.spec.PBEParameterSpec; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Base64; 
import android.util.Log; 
import android.view.ContextMenu; 
import android.view.ContextMenu.ContextMenuInfo; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemSelectedListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Spinner; 

public class MainActivity extends Activity implements OnClickListener { 
    // views for the layout 
    Spinner spin; 
    EditText edit_txt_pass; 
    static EditText edit_txt_enc_string; 
    EditText edit_txt_raw; 
    static EditText edit_txt_dec_string; 
    Button btn_encrypt, btn_decrypt, btn_clear; 

    static String cyphertext = ""; 
    static String STReditTxtPass; 
    String strPaddingencryption; 
    static int iterations = 1000; 
    private static final String[] items = { "Padding Key derivation", 
      "SHA1PRNG key derivation", "PBKDF2 key derivation", 
      "PKCS#12 key derivation" }; 

    private static final String TAG = MainActivity.class.getSimpleName(); 
    private static final String[] Passwords = { "password", "cryptography", 
      "cipher", "algorithm", "qwerty" }; 

    // mesage that will be binded with the key to generate the cypher text 
    private static String PlainText = "this is the text that will be encrypted"; 

    // the list that will be used for the OnItemSelection method 
    private static final int PADDING_ENC_IDX = 0; 
    private static final int SHA1PRNG_ENC_IDX = 1; 
    private static final int PBKDF2_ENC_IDX = 2; 
    private static final int PKCS12_ENC_IDX = 3; 

    byte[] salt = { (byte) 0x11, (byte) 0x9B, (byte) 0xC6, (byte) 0xFE, 
      (byte) 0x33, (byte) 0x44, (byte) 0x55, (byte) 0x77 };; 

    static byte[] ivBytes = {0,0,0,0,0,0,0,0}; 

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

     // creation of the spinner with setting Array adapter and 
     // DropDownresourse 
     spin = (Spinner) findViewById(R.id.spiner); 
     spin.setOnItemSelectedListener(new OnItemSelectedListener() { 

      @Override 
      public void onItemSelected(AdapterView<?> arg0, View arg1, 
        int arg2, long arg3) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onNothingSelected(AdapterView<?> arg0) { 
       // TODO Auto-generated method stub 

      } 
     }); 

     ArrayAdapter<String> aa = new ArrayAdapter<String>(this, 
       android.R.layout.simple_spinner_item, items); 
     aa.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line); 
     spin.setAdapter(aa); 
     // end of the spinner code 

     edit_txt_pass = (EditText) findViewById(R.id.editTxtPass); 
     edit_txt_enc_string = (EditText) findViewById(R.id.editTxtEncString); 
     edit_txt_raw = (EditText) findViewById(R.id.editTxtRawKey); 
     edit_txt_dec_string = (EditText) findViewById(R.id.editTxtDecString); 

     btn_encrypt = (Button) findViewById(R.id.btnEncrypt); 
     btn_encrypt.setOnClickListener(this); 

     btn_decrypt = (Button) findViewById(R.id.btnDecrypt); 
     btn_decrypt.setOnClickListener(this); 

     btn_clear = (Button) findViewById(R.id.btnClear); 
     btn_clear.setOnClickListener(this); 

     ///for registering the editText to the Context Menu 
     registerForContextMenu(edit_txt_pass); 

    } 

    // for the ciphering of the plainText using the base 64 
    public static String toBase64(byte[] bytes) { 
     return Base64.encodeToString(bytes, Base64.NO_WRAP); 
    } 

    public static byte[] fromBase64(byte[] bytes) { 
     // return Base64.encodeToString(bytes, Base64.NO_WRAP); 
     return Base64.decode(bytes, Base64.DEFAULT); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, 
      ContextMenuInfo menuInfo) { 
     // TODO Auto-generated method stub 

     int groupId = 0; 
     menu.add(groupId, 1, 1, "password"); 
     menu.add(groupId, 2, 2, "cryptography"); 
     menu.add(groupId, 3, 3, "cipher"); 
     menu.add(groupId, 4, 4, "algorithm"); 
     menu.add(groupId, 5, 5, "qwerty"); 

     super.onCreateContextMenu(menu, v, menuInfo); 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
     // TODO Auto-generated method stub 

     return getText(item); 

     // return super.onContextItemSelected(item); 
    } 

    private boolean getText(MenuItem item) { 
     // TODO Auto-generated method stub 

     int menuItemId = item.getItemId(); 

     if (menuItemId == 1) { 
      edit_txt_pass.setText("password"); 
     } 
     if (menuItemId == 2) { 
      edit_txt_pass.setText("cryptography"); 
     } 
     if (menuItemId == 3) { 
      edit_txt_pass.setText("cipher"); 
     } 
     if (menuItemId == 4) { 
      edit_txt_pass.setText("algorithm"); 
     } 
     if (menuItemId == 5) { 
      edit_txt_pass.setText("qwerty"); 
     } 
     STReditTxtPass = edit_txt_pass.getText().toString(); 

     Log.w("the String of the Password text", STReditTxtPass); 
     return false; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

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

     if (v == btn_encrypt) { 

      encryptPadding(PlainText, salt); 
     } else if (v == btn_clear) { 
      edit_txt_enc_string.setText(""); 
     } else if (v == btn_decrypt) { 
      decryptPadding(cyphertext, salt); 
     } 
    } 

    public static String encryptPadding(String plaintext, byte[] salt) { 
     try { 
      KeyGenerator kg = KeyGenerator.getInstance("DES"); 
      Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 

      SecretKey SKey = kg.generateKey(); 

      cipher.init(Cipher.ENCRYPT_MODE, SKey); 

      byte[] cipherText = cipher.doFinal(PlainText.getBytes("UTF-8")); 

      cyphertext = String.format("%s%s%s", toBase64(salt), "]", 
        toBase64(cipherText)); 
      edit_txt_enc_string.setText(cyphertext); 
      return cyphertext; 
     } catch (GeneralSecurityException e) { 
      throw new RuntimeException(e); 
     } catch (UnsupportedEncodingException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public static String decryptPadding(String ctext, byte[] salt) { 
     try { 
      KeyGenerator kg = KeyGenerator.getInstance("DES"); 
      Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 

      SecretKey SKey = kg.generateKey(); 

      IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); 
      cipher.init(Cipher.DECRYPT_MODE, SKey, ivSpec); 

      byte[] plaintxt = cipher.doFinal(cyphertext.getBytes("UTF-8")); 

      PlainText = String.format("%s%s%s", fromBase64(salt), "]", 
        fromBase64(plaintxt)); 
      edit_txt_dec_string.setText(PlainText); 
      return PlainText; 
     } catch (GeneralSecurityException e) { 
      throw new RuntimeException(e); 
     } catch (UnsupportedEncodingException e) { 
      throw new RuntimeException(e); 
     } 
    } 

} 
+0

에 http : // stackoverflow.com/questions/17079579/aes-algo-decryption-issue. 도움이되는지 확인하십시오 – Raghunandan

답변

3

당신은 암호 해독 및 암호화

SecretKey SKey = kg.generateKey(); 

이 두 작업을위한 새로운 키를 생성하기위한 동일한 키를 사용해야합니다. 동일한 키를 사용해야합니다.

변경 다음과 같은 방법 :

public String encryptPadding(String plaintext, byte[] salt) { 
    try { 
     Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 

     cipher.init(Cipher.ENCRYPT_MODE, SKey); 

     byte[] cipherText = cipher.doFinal(PlainText.getBytes("UTF-8")); 

     cyphertext = String.format("%s%s%s", toBase64(salt), "]", 
       toBase64(cipherText)); 
     edit_txt_enc_string.setText(cyphertext); 
     return cyphertext; 
    } catch (GeneralSecurityException e) { 
     throw new RuntimeException(e); 
    } catch (UnsupportedEncodingException e) { 
     throw new RuntimeException(e); 
    } 
} 

public String decryptPadding(String ctext, byte[] salt) { 
    try { 
     Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 

     IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); 
     cipher.init(Cipher.DECRYPT_MODE, SKey, ivSpec); 

     byte[] plaintxt = cipher.doFinal(cyphertext.getBytes("UTF-8")); 

     PlainText = String.format("%s%s%s", fromBase64(salt), "]", 
       fromBase64(plaintxt)); 
     edit_txt_dec_string.setText(PlainText); 
     return PlainText; 
    } catch (GeneralSecurityException e) { 
     throw new RuntimeException(e); 
    } catch (UnsupportedEncodingException e) { 
     throw new RuntimeException(e); 
    } 
} 

는 클래스에 새로운 필드 생성 :

private SecretKey SKey; 

을하고에서 onCreate 방법이 줄을 추가

KeyGenerator kg = KeyGenerator.getInstance("DES"); 
SKey = kg.generateKey(); 
+0

어떻게 동일한 secretekey을 만드는가 ??? – user3006788

+0

키를 저장하는 방법은 응용 프로그램에 달려 있습니다. 어쩌면 개인적인 취향에 저장할 수 있습니다. 그것은 단지 짧은 시간에 살았을 것인가, 아마도 수업 시간에 들판으로 살 수있을 것인가. 응용 프로그램을 시작할 때 키를 저장하고 사용하십시오. 그건 너에게 달렸어. 왜 또는 무엇을 암호화하는지 모르겠습니다. – doorstuck

+0

@ doorstuck 나는 내 질문을 편집하고 홀 활동을 추가 할 것이다. 그냥 문자열을 암호 해독합니다. – user3006788