gpt4 book ai didi

java - cipher.doFinal 额外字节

转载 作者:行者123 更新时间:2023-11-29 05:08:16 24 4
gpt4 key购买 nike

我正在尝试在 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 字节,而密文的大小为 7680016 字节。图像是 1600x1200,所以 1600x1200x4= 7680000。我无法将 7680016 字节保存为图像 :( 这些额外的 16 字节是什么?我做错了什么吗?

最佳答案

额外的 16 个字节几乎可以肯定是由于填充。填充使加密更加安全,但如果您不介意去掉它,您可以将密码名称的第三部分((代表填充算法)更改为 NoPadding,以提供"AES/CBC/NoPadding" 的密码名称。

您可以找到有关加密算法名称如何工作的所有详细信息 in the Java security architecture docs .

然而,一般来说,您不应该真正依赖密码生成的输出大小——密码经过精心设计以尽可能安全,您应该将输出大小留给它们。

关于java - cipher.doFinal 额外字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29663813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com