[英]cipher.doFinal extra bytes
我正在嘗試加密Android中的圖像。 我將圖像轉換為字節數組。 后來,我想使用密文來創建一個全新的位圖並保存它。 以下代碼用於我的加密
private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
private static int KEY_LENGTH = 256;
...
public static byte[][] encrypt(byte[] plaintext, SecretKey key, byte[] salt) {
try {
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
byte[] iv = generateIv(cipher.getBlockSize());
IvParameterSpec ivParams = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, ivParams);
byte[] cipherText = cipher.doFinal(plaintext);
return new byte[][]{salt, iv, cipherText};
} catch (GeneralSecurityException e) {
throw new RuntimeException(e);
}
}
問題是cipherText在函數返回時有額外的16個字節。
例如,明文的大小為7680000字節,但cipherText的大小為7680016字節。 圖像是1600x1200,所以1600x1200x4 = 7680000.我無法將7680016字節保存為圖像:(這些額外的16個字節是什么?我做錯了什么?
額外的16個字節幾乎肯定是由於填充。 填充使加密更加安全,但如果您不介意刪除它,可以將密碼名稱的第三個組成部分((表示填充算法)更改為NoPadding
,以提供密碼名稱"AES/CBC/NoPadding"
。
您可以在Java安全體系結構文檔中找到有關加密算法名稱如何工作的所有詳細信息。
但是,一般情況下,您不應該真正依賴密碼生成的輸出大小 - 密碼經過精心設計,盡可能安全,您應該將輸出大小保留給它們。
我認為你不應該擔心文件的大小。 當我完成類似的任務時,我在一個特定的位圖圖像中額外增加了10個字節。
但是,如果要打開加密圖像以使其可打開,則必須使用原始圖像更改位圖文件的前54個字節 。 (bmp的54個字節的頭部給出位圖信息)樣本:
我使用openssl工具加密了這個圖像文件。 這里我如何選擇前54個字節並替換為加密的位圖文件。
如果你想做這樣的事情。 確保在解密之后,還必須更改原始標頭中的54個字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.