每次运行时我都会收到错误
“错误:给定最后一个块没有正确填充”
基本上我正试图暴力破解密钥的最后3个字节,前13个字节是正确的。 知道我做错了什么吗?我尝试删除填充,它的工作原理,但它找不到我确定它存在的明文,并包含“玛丽有”这个词。 注意:我正在使用sun.misc.BASE64Decoder
这是我的代码的一部分。
String myiv = new String(new byte[] {
0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x31,0x30,0x31,0x31,0x31,0x32,0x33
});
char [] mykeyarray = new char[] {0x86,0xe5,0x30,0x90,0xff,0x62,0xa0,0x9a,0x81,0x00,0xad,0x9e,0x8f,0x00,0x00,0x00};
String encoded = "dm8cfvs+c7pKM+WR+fde8b06SB+lqWLS4sZW+PfQSKtTfgPknzYzpTVOtJP3JBoU2Uo/7XWopjoPDOlPr24duuck0z+vAx91bYTwQo4INnIIBkj/lhJMWmvAKaUIO3qzBoGg8ynQOhuG6LY7Wo0uww==";
IvParameterSpec ivspec = new IvParameterSpec(myiv.getBytes());
byte [] decoded;
FileWriter fstream = new FileWriter("out.txt");
BufferedWriter out = new BufferedWriter(fstream);
String mykey;
int repeat = 256;
outerloop:
for(int i=0;i<repeat;i++){
for(int j=0;j<repeat;j++){
for(int k=0;k<repeat;k++){
mykey = new String(mykeyarray);
SecretKeySpec keyspec = new SecretKeySpec(mykey.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
System.out.println("I: "+i+" J: "+j+" K: "+k);
decoded = new BASE64Decoder().decodeBuffer(encoded);
cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
byte [] decrypted = cipher.doFinal(decoded);
String dec = new String(decrypted);
if(dec.contains("Mary")){
out.write(dec);
out.write("\n");
System.out.println(dec);
break outerloop;
}
mykeyarray[15]++;
}
mykeyarray[14]++;
mykeyarray[15]=0x00;
}
mykeyarray[13]++;
mykeyarray[14]=0x00;
mykeyarray[15]=0x00;
}
out.close();
}
catch(Exception e){
System.out.println("Error: " + e.getMessage());
}
}
}
答案 0 :(得分:1)
你的代码犯了很多错误,我不知道你想要完成什么。因此,我将解释为什么您可能会收到BadPaddingException
CBC密码:
祝你好运找到异常的原因。
答案 1 :(得分:0)
尝试了解有关PKCS#5填充的更多信息。这是在加密之前添加到纯文本的特殊字节。如果使用错误的密钥解密文本,则无法正确。如果您强制使用某个键,则除了正确的键之外,您将在每个键上执行此错误。
答案 2 :(得分:0)
由于使用随机密钥进行解密会为您提供随机消息,因此通常无法获得正确的填充。抓住异常并继续前进。
当暴力破坏PKCS5填充消息时,您将获得大约93%的填充错误。 PKCS5填充用你的消息填充包含填充长度的字节。因此有效填充为0x01,0x2 0x02,0x03 0x03 0x03,...,0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF。在随机消息中发生正确填充的几率是1/16 +(1/16)^ 2 ...(1/16)^ 16 <.067。这意味着你得到不正确的填充大约1%6.7 = 93%的时间。