Java AES CBC算法如何检查密码转换的密钥是否正确?

Java AES CBC算法如何检查密码转换的密钥是否正确?,java,encryption,aes,Java,Encryption,Aes,我使用AES/CBC算法对文件或字节数组进行加密 然而,我不明白这个算法是如何在Java中实现的,以检查密码转换的密钥是否正确。输入错误密码时,会引发javax.crypto.BadPaddingException。以下是错误消息: 给定的最后一块未正确填充。如果在解密过程中使用了坏密钥,则可能会出现此类问题 此算法是否将密钥存储在加密文档中?什么是初始化向量?Java如何检查给定的密码密钥是否为真?解密过程中到底发生了什么?代码指定使用PKCS5填充(使用CIPHER\u SPEC=“AES/

我使用AES/CBC算法对文件或字节数组进行加密

然而,我不明白这个算法是如何在Java中实现的,以检查密码转换的密钥是否正确。输入错误密码时,会引发
javax.crypto.BadPaddingException
。以下是错误消息:

给定的最后一块未正确填充。如果在解密过程中使用了坏密钥,则可能会出现此类问题


此算法是否将密钥存储在加密文档中?什么是初始化向量?Java如何检查给定的密码密钥是否为真?解密过程中到底发生了什么?

代码指定使用PKCS5填充(使用
CIPHER\u SPEC=“AES/CBC/PKCS5Padding”
)。这意味着在加密之前,在清除数据的末尾填充1-16个字节。此填充确保数据在加密之前与AES的块大小(16字节)对齐。填充的构造方式很容易检测到它是填充(填充的字节数就是填充的字节数。例如,如果需要5个字节,则填充为
05


如果您使用错误的密钥解密,那么最终会得到随机数据,这在大多数情况下也会给您一个无效的填充。由于填充无效,密码不知道数据的结尾,并给您一个
badpaiddingexception

请不要使用SHA1从密码派生密钥。。取而代之的是使用类似于PBKDF2的propper密钥派生函数。我只需要澄清一下,用错误的密码/密钥解密文件是否会导致文件大小不是16字节的倍数?为什么?如果上次进行解密调用时,没有看到具有正确填充的解密数据,则会失败(并且不给您任何可能保留的数据)…如果碰巧有一些内容是有效的填充(可能是偶然发生的)填充将被删除,而在没有这个填充的情况下,您将被提交其余的数据。您不应该依赖于这种MeCalistic来验证输入了正确的密码。考虑使用像GCM这样的认证模式来捕获像这样的完整性错误。