Encryption 检测是否填充了使用AES CBC加密的文本

Encryption 检测是否填充了使用AES CBC加密的文本,encryption,cryptography,cypher,aes,Encryption,Cryptography,Cypher,Aes,我有一些数据可以使用AES/CBC/NoPadding或AES/CBC/PKCS5Padding加密 我想解密那些数据。所以需要决定使用哪种算法进行解密。根据数据,是否有可能确定加密的数据是否被填充? 或者有其他解决方法吗?评论是正确的,但是,在编程方面有更好的方法;(假设是Java) 试试看{ //做解密。。。。 }catch(javax.crypto.badpattingexception){ system.out.Println(“它不是PKCS#7填充”) e、 printStackTr

我有一些数据可以使用
AES/CBC/NoPadding
AES/CBC/PKCS5Padding
加密

我想解密那些数据。所以需要决定使用哪种算法进行解密。根据数据,是否有可能确定加密的数据是否被填充?
或者有其他解决方法吗?

评论是正确的,但是,在编程方面有更好的方法;(假设是Java)

试试看{
//做解密。。。。
}catch(javax.crypto.badpattingexception){
system.out.Println(“它不是PKCS#7填充”)
e、 printStackTrace();
}捕获(例外e){
e、 printStackTrace();
返回null;
}
如果出现异常,那么它就不是PKCS#7。如果您没有得到异常,那么您有1/256的可能性它不是PKCS#7,但您的文件以字节
0x01
结尾。还有其他情况,例如文件以
0x0202
结尾,但是,概率非常低,也低于其他情况。最简单的方法是尝试多个文件

我为什么说
PKCS#7 padding
很简单。虽然Java说PKCS#5填充,但事实并非如此,而是PKCS#7填充取代了#5#5设计用于64位块大小的密码,如DES,而#7设计为256字节,其中AES的块大小为128位



请注意,概率是假设文件是随机的,而不是常规文本文件。

不,如果事先不知道明文的长度,则不可能。请使用NoPadding进行解密。然后看解密文本的结尾。如果有填充,它就会出现在那里。您可以检查它以确定在加密端使用了何种填充。如果最初是用NoPadding加密的,则解密后的文本将正常结束,结尾添加的填充字符中不会有任何奇怪的字符。@rossum:除非使用“无奇怪字符”,否则无法区分填充的纯文本和恰好具有相同字符的未添加的纯文本您的意思是类似ASCII文本的内容。如果解密文本以0x03 0x03 0x03结尾,则很可能是3字节的PKCS7填充。如果以0x00 0x00 0x00 0x00结束。。。然后很可能是填充零。你不能绝对肯定,但你可以做出有根据的猜测。谢谢你的回答。您知道为什么在少数情况下不会抛出BadPaddingException吗?就我而言,我有很多数据要解密。我听了你的建议,注意到在少数情况下,解密的数据比应该的数据小一个字节。你读了第一段了吗?不清楚吗?如果最后一个字节是
0x01
,则它是PKCS#7的有效填充。在1/256的情况下(如果数据是均匀随机的),您将获得有效的填充,尽管数据没有填充。