2017-03-31 46 views
1

我正在嘗試使用以下方法來處理使用Apache Commons Crypto的AES數據的加密和解密。加密工作正常。但是當我嘗試解密剛剛加密的數據時,我得到了這個塊大小錯誤,我並不完全明白,因爲我將塊大小設置爲1024,當然這是16的倍數。Apache Commons Crypto - 獲取IllegalBlockSizeException

javax.crypto.IllegalBlockSizeException: Input length (with padding) not multiple of 16 bytes 

這是我的代碼:

 final int bufferSize = 1024; 
    try { 
     this.cryptoCipher.init(cipherMode, this.secretKeySpec, this.ivParameterSpec); 
     ByteBuffer inBuffer = ByteBuffer.allocateDirect(bufferSize); 
     ByteBuffer outBuffer = ByteBuffer.allocateDirect(bufferSize); 
     inBuffer.put(getUTF8Bytes(dataToBeEncrypted)); 
     inBuffer.flip(); 
     int updateBytes = this.cryptoCipher.update(inBuffer, outBuffer); 
     int finalBytes = this.cryptoCipher.doFinal(inBuffer, outBuffer); <<<< EXCEPTION HAPPENS HERE!!! 
     byte[] encoded = new byte[updateBytes + finalBytes]; 
     outBuffer.flip(); 
     outBuffer.duplicate().get(encoded); 
     encryptedDecryptedData = DatatypeConverter.printBase64Binary(encoded); 
    } catch (Exception exc) { 
     LOGGER.logp(Level.SEVERE, MODULE_NAME, methodName, "encountered exception: {0}", exc); 
    } 

回答

0

AES具有一個塊大小:16字節,因此設定的塊尺寸爲另一個值是錯誤的。但是你並沒有設置塊大小,只是創建了一個1024字節的緩衝區(在本例中)。

大多數實現接受一個數組,並且會一次在內部處理一個塊的輸入。但輸入必須是塊大小的精確倍數,並且通過填充(通常爲PKCS#7 padding)來完成,並且一個選項通過添加加密和解密時刪除來自動處理。

+0

謝謝,Zaph。我使用'AES/CBC/PKCS5Padding'作爲變換值。我在其他地方看到,這應該在inyernally自動轉換爲PKCS7。但是,我只是嘗試將其更改爲'AES/CBC/PKCS7Padding',現在我得到一個錯誤: 導致:javax.crypto.NoSuchPaddingException:填充:未實現PKCS7Padding 我正在使用IBM Java 7.1。 – Westy

+0

使用'AES/CBC/PKCS5Padding',PKCS#5填充是PKCS#7的一個子集,但在所有實現中,它都支持PKCS#7。由於許多庫在AES之前都會繼續使用相同的填充常量。 – zaph

+0

好的,謝謝。問題是,這就是我一直在使用的,這就是我的錯誤。所以我現在有點失落。請參閱下面的「答案」(因爲無論出於何種原因,評論從未爲我正確格式)。 – Westy

相關問題