2016-03-24 55 views
0

我用下面的代碼來加密數據。我的輸入是16字節,密鑰是16字節,但我得到的輸出(加密數據)是32字節。爲什麼?爲什麼AES 128加密擴展數據?

public static byte[] encrypt(byte[] plainText, byte[] key) { 
try { 
    byte[] passwordKey128 = Arrays.copyOfRange(key, 0, 16); 
    SecretKeySpec secretKey = new SecretKeySpec(passwordKey128, "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
    byte[] cipherText = cipher.doFinal(plainText); 
    // String encryptedString = Base64.getEncoder().encodeToString(cipherText); 
    return cipherText; 

可能是什麼原因? AES是否添加了一些數據?

+0

可能的重複[Where to put information about padding length?](http://stackoverflow.com/questions/26930911/where-to-put-information-about-padding-length) –

+0

根據標準,AES有一個128位的塊大小。換句話說,其他塊大小是非標準的。您引用不會透露軟件開發人員「cipher.doFinal()」的功能。因此,恕我直言,最好請求軟件開發人員解釋您觀察到的現象。 –

+0

一般建議:**始終使用完全合格的密碼字符串**'Cipher.getInstance(「AES」);'可能導致取決於默認安全提供程序的不同密碼。它很可能會導致''AES/ECB/PKCS5Padding'',但它不一定是。如果它改變,你將失去不同JVM之間的兼容性。 –

回答

2

您通過Cipher.getInstance(transformation)方法,其中改造的形式爲獲得Cipher對象:

"algorithm/mode/padding" or 
"algorithm" 

當你做到這一點通過加密提供商列表中執行搜索系統,並確定是否有任何實現支持此。如果您不指定模式和填充,則直到加密提供程序決定要使用的默認模式和填充。

根據this,例如,SunJCE默認爲ECB作爲默認模式,並且PKCS5Padding

由於PKCS5Padding總是添加至少一個字節,它將推動您的16個字節超過塊的限制,並創建需要兩個塊。