我正在尝试加密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个字节是什么?我做错了什么?
答案 0 :(得分:2)
额外的16个字节几乎肯定是由于填充。填充使加密更加安全,但如果你不介意摆脱它,你可以将密码名称的第三个组成部分((代表填充算法)更改为NoPadding
,密码名称"AES/CBC/NoPadding"
。
您可以找到有关加密算法名称如何工作的所有详细信息。{/ 3}。
但是,一般情况下,您不应该真正依赖密码生成的输出大小 - 密码经过精心设计,尽可能安全,您应该将输出大小保留给它们
答案 1 :(得分:1)
我认为你不应该担心文件的大小。当我完成类似的任务时,我在一个特定的位图图像中额外增加了10个字节。
但是,如果要打开加密图像以使其可打开,则必须使用原始图像更改位图文件的第一个 54个字节。 (bmp的54个字节的头部给出了位图信息) 样品:
我已使用openssl工具加密此图像文件。这里我如何选择前54个字节并替换为加密的位图文件。
如果你想做这样的事情。确保解密后,还必须更改原始标题中的54个字节。