cipher.doFinal额外字节

时间:2015-04-16 01:27:35

标签: java android encryption aes pkcs#5

我正在尝试加密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个字节是什么?我做错了什么?

2 个答案:

答案 0 :(得分:2)

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

您可以找到有关加密算法名称如何工作的所有详细信息。{/ 3}。

但是,一般情况下,您不应该真正依赖密码生成的输出大小 - 密码经过精心设计,尽可能安全,您应该将输出大小保留给它们

答案 1 :(得分:1)

我认为你不应该担心文件的大小。当我完成类似的任务时,我在一个特定的位图图像中额外增加了10个字节。

但是,如果要打开加密图像以使其可打开,则必须使用原始图像更改位图文件的第一个 54个字节。 (bmp的54个字节的头部给出了位图信息) 样品:enter image description here

我已使用openssl工具加密此图像文件。这里我如何选择前54个字节并替换为加密的位图文件。 enter image description here

如果你想做这样的事情。确保解密后,还必须更改原始标题中的54个字节。