cipher.doFinal 额外字节
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);
}
}
问题是当函数 returns.
时 cipherText 有额外的 16 个字节
例如,明文大小为7680000字节,而密文大小为7680016字节。图像是 1600x1200,所以 1600x1200x4= 7680000。我无法将 7680016 字节保存为图像 :( 这些额外的 16 字节是什么?我做错了什么吗?
我认为您不必担心文件的大小。当我完成类似的任务时,我在一个特定的位图图像中多了 10 个字节。
但是,如果你想打开加密的图像,那么你必须用原始图像改变位图文件的前 54 个字节。 (bmp的header54字节给出了位图信息)
示例:
我已经使用 openssl 工具加密了这个图像文件。这里我是如何选择前 54 个字节并用加密的位图文件替换的。
如果你想做这样的事情。确保解密后,您还必须更改原始 header.
的 54 个字节
额外的 16 个字节几乎可以肯定是由于填充。填充使加密更加安全,但如果您不介意去掉它,您可以将密码名称的第三部分((代表填充算法)更改为 NoPadding
,以给出密码名称共 "AES/CBC/NoPadding"
.
您可以找到有关加密算法名称如何工作的所有详细信息in the Java security architecture docs。
但是,一般来说,您不应该真正依赖密码生成的输出大小 -- 密码经过精心设计以尽可能安全,您应该将输出大小留给它们.
我正在尝试加密 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);
}
}
问题是当函数 returns.
时 cipherText 有额外的 16 个字节例如,明文大小为7680000字节,而密文大小为7680016字节。图像是 1600x1200,所以 1600x1200x4= 7680000。我无法将 7680016 字节保存为图像 :( 这些额外的 16 字节是什么?我做错了什么吗?
我认为您不必担心文件的大小。当我完成类似的任务时,我在一个特定的位图图像中多了 10 个字节。
但是,如果你想打开加密的图像,那么你必须用原始图像改变位图文件的前 54 个字节。 (bmp的header54字节给出了位图信息)
示例:
我已经使用 openssl 工具加密了这个图像文件。这里我是如何选择前 54 个字节并用加密的位图文件替换的。
如果你想做这样的事情。确保解密后,您还必须更改原始 header.
的 54 个字节额外的 16 个字节几乎可以肯定是由于填充。填充使加密更加安全,但如果您不介意去掉它,您可以将密码名称的第三部分((代表填充算法)更改为 NoPadding
,以给出密码名称共 "AES/CBC/NoPadding"
.
您可以找到有关加密算法名称如何工作的所有详细信息in the Java security architecture docs。
但是,一般来说,您不应该真正依赖密码生成的输出大小 -- 密码经过精心设计以尽可能安全,您应该将输出大小留给它们.