使用相同的AES算法对文件进行错误填充异常?

时间:2016-06-07 18:33:31

标签: java algorithm encryption cryptography

我正在编写一个简单的自定义加密器/解密器 基本上,我只需要取一个大文件的前1024个字节并对其进行加密 我使用了RandomAccessFile,这样我就可以快速加密和解密前1024字节。

现在,我面临的问题是即使我使用相同的算法进行加密和解密 加密工作正常,但解密会抛出 javax.crypto.BadPaddingException:给定最终块未正确填充

无论我搜索多少,我都无法弄清楚出了什么问题。对此的一些研究告诉我,由于UTF和base64等格式不同,填充不正确。但我不确定如果我读取这么大的文件的第一个1024字节& padding可能是不正确的。加密没有例外。此外,我没有转换为字符串。

我提供了简单的评论,代码

cameraPreview.style.transform = "scale(-1, 1)";

1 个答案:

答案 0 :(得分:3)

首先,SUN提供商在内部将"AES"算法字符串转换为"AES/ECB/PKCS5Padding"。这意味着您使用的是不安全的ECB模式加密,而不是更安全的CBC模式。

您获得BadPaddingException的原因很简单。当您使用PKCS5Padding(或更准确地说是PKCS#7填充)时,每个16字节在加密期间最多填充32个字节。但是,您只存储未填充的16个字节。如果您尝试解密unpadding机制,请尝试解压缩原始的未填充明文,这将失败。

其次,read方法实际上可能不会读取16个字节。它只读取最多 16个字节。您需要创建一个单独的方法来始终精确读取16个字节。

多次调用doFinal并不是一个好主意。您最好一次性读取1024字节,然后只调用一次doFinal或 - 甚至更好 - update。在这种情况下,你应该使用例如"AES/CBC/NoPadding"作为算法字符串。

注意:

  • 没有随机IV,您仍然可以区分以相同字节开头的文件(或以相同字节开头的时间重新加密的文件);
  • 您可能希望使用某种协议来处理小于1024字节的文件;
  • 使用"尝试使用资源"可能是一个非常好的主意;
  • 使用文件的内存映射以实现更清洁的设计和(可能)更快的操作。