Error: Given final block nicht richtig gepolstert
Ich erhalte eine Fehlermeldung jedes mal wenn ich dieses
"Error: Given final block nicht richtig gepolstert"
Ich versuche, brute-force auf den letzten 3 bytes der Schlüssel, die ersten 13 bytes korrekt sind.
Irgendeine Idee, was ich falsch mache? Ich habe versucht, entfernen die Polsterung und es funktioniert, aber es nicht finden konnte, die Klartext, dass ich bin sicher, dass es existiert und enthält das Wort "Mary had".
Hinweis: ich bin mit der Sonne.misc.BASE64Decoder
hier ist ein Teil von meinem code.
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());
}
}
}
InformationsquelleAutor Algorithmatic | 2012-10-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen zu lernen, mehr über PKCS#5 padding. Es ist eine Besondere bytes beeing Hinzugefügt Klartext vor Verschlüsselung. Es kann nicht richtig sein, wenn der text entschlüsselt wurde, mit einem falschen Schlüssel. Wenn Sie die brute-force-ein Schlüssel, nimm diesen Fehler auf jeder Taste, außer richtige.
AES/CBC/NoPadding
, so wird es nicht scheitern. Sie werden immer noch Müll mit dem falschen Schlüssel, aber Sie werden in der Lage, um zu sehen, den Müll.Deine Antwort falsch ist Pavel, ein
BadPaddingException
geworfen werden etwas häufiger als einmal in 256 mal. Jedes mal, wenn die Entschlüsselung endet mit01
in hex wäre es eine richtige PKCS5Padding (0202
etc. wäre auch einer, aber das ist viel weniger wahrscheinlich passieren, natürlich). Das bedeutet nicht, dass der Schlüssel korrekt ist, oder dass der resultierende Klartext korrekt ist.Ok, ich wusste nicht, berechnet die Wahrscheinlichkeit der richtigen Polsterung im random block. Habe ich eben erklärt, der Grund der Ausnahme.
InformationsquelleAutor Pavel Ognev
Dein code macht viele, viele Fehler, und ich weiß nicht, was Sie versuchen zu erreichen. So werde ich erläutern, warum Ihnen möglicherweise eine
BadPaddingException
für einen CBC-Chiffre:Glück die Jagd nach der Ursache der Ausnahme.
InformationsquelleAutor Maarten Bodewes
Seit der Entschlüsselung mit einem zufälligen Schlüssel gibt Ihnen eine zufällige Nachricht, die Sie in der Regel nicht bekommen, die richtige Polsterung. Nur fangen Sie die Ausnahme und bewegen auf.
Erhalten Sie Polsterung Fehler etwa 93% der Zeit, wenn brute Force ein PKCS5 gepolsterte Nachricht. PKCS5 padding-pads aus Ihrer Nachricht mit bytes mit der Länge der Polsterung. So gilt Polsterung ist 0x01, 0 x 2, 0x02, 0x03 0x03 0x03, ...., 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF. Die Verschiedenheit der richtigen Polsterung geschieht in einer zufälligen Nachricht 1/16 + (1/16)^2 ... (1/16)^16 <.067. Was bedeutet, dass Sie falsche Polsterung etwa 1 %6.7 = 93% der Zeit.
InformationsquelleAutor imichaelmiers