2013-07-10 1 views
0

이 종류의 예외를 해결하는 방법을 설명하는 많은 내용을 읽었지만 여전히 해결할 수 없습니다.이 코드의 "javax.crypto.IllegalBlockSizeException : 마지막 블록 불완전한 암호화"해결 방법

내 대상은 입니다. 1. SecretKey를 사용하여 문자열 데이터를 암호화하고 SQLite 데이터베이스에 저장하십시오. 2. SQLite 데이터베이스에서 데이터를 읽고 동일한 SecretKey를 사용하여 암호를 해독합니다.

이것은 안드로이드 애플리케이션 (목표 1 구현 : & 2)의 데이터를 암호화하고 해독하는 제 수업입니다. 이 코드는 예외를 제공합니다 - javax.crypto.IllegalBlockSizeException : 마지막 블록이 암호 해독에서 불완전합니다

어떻게이 오류를 해결할 수 있습니까? 모든 sugestion 부탁드립니다 .. 감사합니다


 public class Cryptography { 

    private String encryptedFileName = "Enc_File2.txt"; 
    private static String algorithm = "AES"; 
    private static final int outputKeyLength = 256; 
    static SecretKey yourKey = null; 

    SQLiteDatabase database; 
    DBHelper helper; 
    Context context; 

    //saveFile("Hello From CoderzHeaven testing :: Gaurav Wable"); 
    //decodeFile(); 

    public Cryptography (Context context) { 
     this.context = context; 
     helper = new DBHelper(context); 
     database = helper.getWritableDatabase(); 
    } 


    public String encryptString(String data) { 
     char[] p = { 'p', 'a', 's', 's' }; 
     //SecretKey yourKey = null; 
     byte[] keyBytes = null; 
     byte[] filesBytes = null; 
     try { 
      if(this.yourKey == null) { 
       Log.d("key", "instance null"); 
       Cursor cursor = database.query("assmain", new String[]{"keyAvailability"}, null, null, null, null, null); 
       cursor.moveToFirst(); 
       if(cursor.getInt(cursor.getColumnIndex("keyAvailability")) == 1) { 
        Log.d("key", "exists in DB"); 
        keyBytes = cursor.getBlob(cursor.getColumnIndex("key")); 
        cursor.close(); 
        filesBytes = encodeFile(keyBytes, data.getBytes()); 
       } else { 
        Log.d("key", "generating"); 
        this.yourKey = generateKey(p, generateSalt().toString().getBytes()); 
        filesBytes = encodeFile(this.yourKey, data.getBytes()); 
       } 
      } else { 
       Log.d("key", "instance exists"); 
       //yourKey = this.yourKey; 
       filesBytes = encodeFile(yourKey, data.getBytes()); 
      } 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return new String(filesBytes); 
    } 

    public String decryptString(String data) { 
     String str = null; 
     byte[] decodedData = null; 
     try { 
      Log.d("To decrypt", data); 
      if(this.yourKey == null) { 
       Log.d("key", "null"); 
       Cursor cursor = database.query("assmain", new String[]{"keyAvailability"}, null, null, null, null, null); 
       cursor.moveToFirst(); 
       if(cursor.getInt(cursor.getColumnIndex("keyAvailability")) == 1) { 
        Log.d("key", "exists in DB"); 
        byte[] keyBytes = cursor.getBlob(cursor.getColumnIndex("key")); 
        cursor.close(); 
        decodedData = decodeFile(keyBytes, data.getBytes()); 
       } else { 
        Log.d("key", "Unavailable"); 
        Toast.makeText(context, "Key Unavailable", Toast.LENGTH_SHORT).show(); 
       } 
      } else { 
       Log.d("key", "instance exists"); 
       decodedData = decodeFile(this.yourKey, data.getBytes()); 
      } 
      decodedData = decodeFile(yourKey, data.getBytes()); 
      str = new String(decodedData); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return str; 
    } 

    public static SecretKey generateKey(char[] passphraseOrPin, byte[] salt) 
      throws NoSuchAlgorithmException, InvalidKeySpecException { 
     // Number of PBKDF2 hardening rounds to use. Larger values increase 
     // computation time. You should select a value that causes computation 
     // to take >100ms. 
     final int iterations = 1000; 

     // Generate a 256-bit key 
     //final int outputKeyLength = 256; 

     SecretKeyFactory secretKeyFactory = SecretKeyFactory 
       .getInstance("PBKDF2WithHmacSHA1"); 
     KeySpec keySpec = new PBEKeySpec(passphraseOrPin, salt, iterations, 
       outputKeyLength); 
     yourKey = secretKeyFactory.generateSecret(keySpec); 
     return yourKey; 
    } 

    public static SecretKey generateSalt() throws NoSuchAlgorithmException { 
     // Generate a 256-bit key 
     //final int outputKeyLength = 256; 

     SecureRandom secureRandom = new SecureRandom(); 
     // Do *not* seed secureRandom! Automatically seeded from system entropy. 
     KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); 
     keyGenerator.init(outputKeyLength, secureRandom); 
     SecretKey key = keyGenerator.generateKey(); 
     return key; 
    } 

    public static byte[] encodeFile(SecretKey yourKey, byte[] fileData) 
      throws Exception { 
     byte[] data = yourKey.getEncoded(); 
     SecretKeySpec skeySpec = new SecretKeySpec(data, 0, data.length, 
       algorithm); 
     Cipher cipher = Cipher.getInstance(algorithm); 
     cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 

     byte[] encrypted = cipher.doFinal(fileData); 

     return encrypted; 
    } 

    public static byte[] encodeFile(byte[] data, byte[] fileData) 
      throws Exception { 
     //byte[] data = yourKey.getEncoded(); 
     SecretKeySpec skeySpec = new SecretKeySpec(data, 0, data.length, 
       algorithm); 
     Cipher cipher = Cipher.getInstance(algorithm); 
     cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 

     byte[] encrypted = cipher.doFinal(fileData); 

     return encrypted; 
    } 

    public static byte[] decodeFile(SecretKey yourKey, byte[] fileData) 
      throws Exception { 
     byte[] data = yourKey.getEncoded(); 
     SecretKeySpec skeySpec = new SecretKeySpec(data, 0, data.length, 
       algorithm); 
     //Cipher cipher = Cipher.getInstance(algorithm); 
     Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, skeySpec); 

     byte[] decrypted = cipher.doFinal(fileData); 

     return decrypted; 
    } 

    public static byte[] decodeFile(byte[] data, byte[] fileData) 
      throws Exception { 
     //byte[] data = yourKey.getEncoded(); 
     SecretKeySpec skeySpec = new SecretKeySpec(data, 0, data.length, 
       algorithm); 
     Cipher cipher = Cipher.getInstance(algorithm); 
     cipher.init(Cipher.DECRYPT_MODE, skeySpec); 

     byte[] decrypted = cipher.doFinal(fileData); 

     return decrypted; 
    } 
    } 

오류 조각

07-01 14:50:48.230: W/System.err(11715): javax.crypto.IllegalBlockSizeException: last block incomplete in decryption 
07-01 14:50:48.230: W/System.err(11715): at com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(BaseBlockCipher.java:705) 
07-01 14:50:48.230: W/System.err(11715): at javax.crypto.Cipher.doFinal(Cipher.java:1111) 
07-01 14:50:48.230: W/System.err(11715): at com.cdac.authenticationl3.Cryptography.decodeFile(Cryptography.java:170) 
07-01 14:50:48.230: W/System.err(11715): at com.cdac.authenticationl3.Cryptography.decryptString(Cryptography.java:95) 

답변

0

파일을 암호화하는 동안 파일을 해독 AES/ECB/PKCS5Padding에를 사용하는 것이 아니라,이다. 암호화 프로세스에 AES/ECB/PKCS5Padding을 추가하십시오. 그래서

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 

희망해야 이것은 내가 Cipher.getInstance ("AES")를 사용

+0

을하는 데 도움이; 암호화 및 암호 해독 모두. 고마워. 에이미. 하지만 실제 문제는 암호화 된 바이트 []를 SQLite 데이터베이스에 저장하기 위해 String으로 변환 한 것이 었습니다. 이 문제는 byte [] 형식의 데이터베이스에 데이터를 추가하여 해결되었습니다. 다른 검색어 : Android 공유 환경 설정에 바이트 배열이 저장되지 않습니다. 이 경우 공유 된 환경 설정에 데이터를 저장하기 위해 무엇을 할 수 있습니까? byte []를 문자열로 변환하려고 시도하고 공유 기본 설정에 추가되었으며 base64 인코딩을 적용했지만 IlleglalBlockSizeException을 해결하지 못합니다. – Gaurav

관련 문제