2011-07-29 118 views
3

我需要使用AES加密文件,CBC塊大小爲16字節,密鑰爲256位。並且該文件需要被填充爲16個字節的倍數。在對文件進行加密之後,填充的零的數量需要追加到最後。Android AES加密零填充

例如,如果我有一個9字節的文件,則會附加7個零字節。 16個字節將被加密,然後讀取數據的長度9將被追加到最後。所以總長度應該是17字節,最後一個字節是未加密的。我使用Cipher類,我知道使用「AES/CBC /」,但我不知道是否有填充方法來描述我想要的內容。

編輯: 最後一個字節應該是最後16字節填充單元中的實際數據的字節數。

+0

我理解的說法,不知道我理解你的問題,你問如何構建與正確的填充或緩衝? – Idistic

+0

我只想知道是否有填充方法的名稱或我必須手動執行此操作?如果有名字,是否支持? – Hank

+0

正如Timothyjc的回答中所述,它有填充機制可用,以便爲您填充填充「AES/ECB/PKCS7Padding」處理最多255個字節的塊大小 – Idistic

回答

0

您不需要手動執行任何操作,因爲Android擁有您需要的所有庫(通過JCE)可以輕鬆完成此任務。

我貼一些AES encryotion代碼,我寫這裏的Android應用:http://pocket-for-android.1047292.n5.nabble.com/Encryption-method-and-reading-the-Dropbox-backup-td4344194.html#a4454327

你可能要注意填充的計劃,這在我的情況是PKCS5Padding。

+0

我正在尋找的是填充名稱計劃,這是我在上面提到的問題。 – Hank

+0

你可以試試ANSI X.923 ... http://stackoverflow.com/questions/1329730/java-ansi-x923-padding,http://en.wikipedia.org/wiki/Padding_%28cryptography%29。 – timothyjc

+0

ANSI X.923類似但不相同,因爲長度字節也被加密。 – Hank

2

不知道你是否已經解決了你的問題,但我認爲你正在尋找的填充類型是ZeroBytePadding。此代碼對我的作品在2.3.3模擬器:

String stringKey = "60380131061660211660380426804995"; 
String message = "This is a secret message"; 
try { 
    SecretKeySpec sks = new SecretKeySpec(stringKey.getBytes(),"AES"); 
    Cipher c = Cipher.getInstance("AES/ECB/ZeroBytePadding"); // Change to CBC and use appropriate IV 
    c.init(Cipher.ENCRYPT_MODE, sks); 
    c.update(message.getBytes()); 
    byte[] ciphertext = c.doFinal(); 
    Log.i("CE", new String(ciphertext)); 

    } catch (NoSuchAlgorithmException e) { 
     Log.e("CE",e.getMessage()); 
    } catch (NoSuchPaddingException e) { 
     Log.e("CE",e.getMessage()); 
    } catch (InvalidKeyException e) { 
     Log.e("CE",e.getMessage()); 
    } catch (IllegalBlockSizeException e) { 
     Log.e("CE",e.getMessage()); 
    } catch (BadPaddingException e) { 
     Log.e("CE",e.getMessage()); 
} 
+0

我重新讀你的問題,我認爲ZeroBytePadding不是你想要的。如果ANSI X.923也不是你想要的(因爲你不希望最後一個字節被加密),那麼你將不得不自己編寫填充例程。因此,使用X.923填充消息,複製最後一個字節,然後加密,然後將帶零長度的最後一個字節附加到文件中。 – Chopstick

+3

'Cipher cipher = Cipher.getInstance(「AES/ECB/ZeroBytePadding」);'yield''找不到任何支持「AES/ECB/ZeroBytePadding」的提供商。你碰巧知道我應該使用什麼提供商? –

+0

@OneTwoThree ZeroBytePadding應該在Android中工作,因爲它基於Bouncy Castle代碼,但不在JRE中。如果它不可用,請添加並配置Bouncy Castle提供程序或使用Spongy Castle。 –