2013-01-10 30 views
0

데이터를 암호화하고 해독하는 두 가지 기능을 작성했습니다.AES-CBC-PKCS5Padding을 사용하여 데이터를 해독 할 때 패딩 오류가 발생했습니다.

public static void encrypt() throws Exception { 
    // Add the BouncyCastle Provider 
    //Security.addProvider(new BouncyCastleProvider()); 


// Generate the key 
byte[] keyBytes = "AAAAAAAAAAAAAAAA".getBytes(); 
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES"); 

// Generate the IV 
byte[] ivBytes = "AAAAAAAAAAAAAAAA".getBytes(); 
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); 

// Create the cipher object and initialize it 
Cipher   cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); 

// Read all bytes from a file into a bytes array 
byte[] inputBytes = GCM.readFile("input"); 
byte[] cipherBytes = cipher.doFinal(inputBytes); 

BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("output.enc")); 
outputStream.write(cipherBytes); 

outputStream.close(); 
} 

public static void decrypt() throws Exception { 
    // Add the BouncyCastle Provider 
    //Security.addProvider(new BouncyCastleProvider()); 

// Generate the key 
byte[] keyBytes = "AAAAAAAAAAAAAAAA".getBytes(); 
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES"); 

// Generate the IV 
byte[] ivBytes = "AAAAAAAAAAAAAAAA".getBytes(); 
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); 

// Create the cipher object and initialize it 
Cipher   cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); 

// Read all bytes from a file into a bytes array 
byte[] cipherBytes = GCM.readFile("ouput.enc"); 
byte[] decBytes = cipher.doFinal(cipherBytes); 

BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("regen.plain")); 
outputStream.write(decBytes); 
outputStream.close(); 
} 

코드가 "AAAAAAAAAAAAAAAA".getBytes()으로 설정되어 있다는 것을 알고 있습니다. 그러나 이것은 단지 하나의 예일 뿐이므로 제발 참아주십시오.

나는 다음과 같은 스택 추적을 얻을 프로그램을 실행하면 : -

Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher 
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) 
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) 
    at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..) 
    at javax.crypto.Cipher.doFinal(DashoA13*..) 
    at GCM.decrypt(GCM.java:80) 
    at GCM.main(GCM.java:90) 

나는이 오류가 발생하고있어 이유를 알아내는 데 문제가 있어요. 문제를 해결할 수있는 방법에 대한 힌트가 있습니까?

[편집] 내가 다시 읽을 때 은 내가 데이터를 쓸 때 모두 16 바이트 만 15 바이트가있는 것 같다.

답변

1

업데이트시 : 그렇다면 쉽게 읽을 수있는 부분을 수정하십시오. 암호문은 N * blocksize 일 필요가 있으므로 16 바이트가되어야합니다. 다른 뻔뻔한 오류는 보이지 않습니다.

1

가능한 문제는 output.enc 쓰기 (이것은 오타가 아닌 경우) 그러나 ouput.enc에서 읽습니다.