2012-05-14 163 views
0

我運行AES加密此Java代碼:AES加密輸出長度

byte[] iv = new byte[16]; 

SecretKey aesKey = new SecretKeySpec("hex key here", "AES"); 

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
cipher.init(Cipher.ENCRYPT_MODE, aesKey, new IvParameterSpec(iv)); 

return cipher.doFinal("32 characters here ...".getBytes()); 

我總是得到一個48個字節輸出,但我具有被期待一個32個字節的輸入的遺留系統。如何控制輸出長度?

注:我必須使用AES CBC

+0

所以你運行上面的代碼和doFinal的結果是96字節? –

+1

爲什麼你期望64個字節的輸出? 「某些文本」將生成帶有PKCS#5填充的單個塊輸出,並且假設您使用的是AES-256,則它將是32個字節。 – vhallac

+0

通過使用'getBytes()'而不指定字符集,您依賴於默認值,這通常是一個錯誤。此外,沒有編碼,我知道哪些「一些文本」將導致多達64個字節的輸出,更不用說96. –

回答

5

你得到,因爲你正在使用的填充的32 + 16個字節。

填充通常只填充剩餘的字節,直到下一個密碼塊已滿爲止。但在你的情況下,明文已經使用了2個塊(2 * 16字節)。在這種情況下,沒有空間來編碼信息「無需填充」。因此必須添加一個僅包含填充數據的附加密碼塊。

可能是遺留系統不使用填充。嘗試「AES/CBC/NoPadding」

+0

謝謝,這樣做! –