我正在编写一个简单的自定义加密器/解密器 基本上,我只需要取一个大文件的前1024个字节并对其进行加密 我使用了RandomAccessFile,这样我就可以快速加密和解密前1024字节。
现在,我面临的问题是即使我使用相同的算法进行加密和解密 加密工作正常,但解密会抛出 javax.crypto.BadPaddingException:给定最终块未正确填充。
无论我搜索多少,我都无法弄清楚出了什么问题。对此的一些研究告诉我,由于UTF和base64等格式不同,填充不正确。但我不确定如果我读取这么大的文件的第一个1024字节& padding可能是不正确的。加密没有例外。此外,我没有转换为字符串。
我提供了简单的评论,代码
cameraPreview.style.transform = "scale(-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"
作为算法字符串。
注意: