首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cipher.doFinal额外字节

cipher.doFinal额外字节
EN

Stack Overflow用户
提问于 2015-04-16 01:27:34
回答 2查看 1.4K关注 0票数 1

我正试图在Android中加密一个图像。我把图像转换成字节数组。稍后,我想使用密码文本创建一个全新的位图并保存它。下面的代码用于我的加密

代码语言:javascript
复制
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字节是什么?)我做错了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-16 01:49:27

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

但是,如果要打开加密的图像以便可操作,则必须使用原始图像更改位图文件的第一个54字节。( bmp的头54个字节提供位图信息)示例:

我已经使用openssl工具加密了这个图像文件。这里我如何选择前54个字节,并替换为加密位图文件。

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

票数 1
EN

Stack Overflow用户

发布于 2015-04-16 01:58:24

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

您可以找到关于加密算法名称如何工作的所有血淋淋的详细信息,在Java安全体系结构文档中

然而,一般来说,你不应该真的依赖密码产生的输出的大小--密码是精心设计的,以尽可能的安全,你应该把输出大小留给他们。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29663813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档