AES BadPaddingException
wenn ich eine falsche Taste oder das falsche Salz für die Entschlüsselung ein BadPaddingException geworfen wird.
Ich würde erwarten, dass eine fehlerhafte Zeichenfolge zurückgegeben werden.
Die doFinal() bewirkt, dass die Ausnahme in der decrypt-Methode
Nachricht : This is just an example
Unfug : 'ΩÙΩ„SåF?V®ßs.k˚·ºç€èÀHfif∫ÙÉÕ
Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at casino.AES.decryptString(AES.java:130)
at casino.AES.main(AES.java:172)
public static void main(String[] args) throws Exception {
//Encryption
AES encr = new AES();
encr.setKey("KEY");
encr.setSalt("SALT");
encr.setup();
String message = "This is just an example";
System.out.println("Message : " + message);
byte[] code = encr.encrypt(message);
System.out.println("Encrypted Strinng : "+ new String(code, "UTF-8"));
//Decryption
AES dec = new AES();
dec.setKey("INCORRECT"); //<--- incorrect
dec.setSalt("SALT");
dec.setup();
System.out.println(dec.decryptString(code));
}
public synchronized void setKey(String key) throws UnsupportedEncodingException {
this.key = key.getBytes("UTF-8");
isPasswordAlreadySet = true;
}
public synchronized void setSalt(String salt) throws UnsupportedEncodingException {
this.salt = salt.getBytes("UTF-8");
}
public synchronized void setup() throws Exception {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(key);
digest.update(salt);
byte[] raw = digest.digest();
skeySpec = new SecretKeySpec(raw, "AES");
cipher = Cipher.getInstance("AES");
}
public synchronized byte[] encrypt(byte[] klartext) throws Exception {
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(klartext);
return encrypted;
}
public synchronized byte[] encrypt(String klartext) throws Exception{
return encrypt(klartext.getBytes("UTF-8"));
}
public synchronized byte[] decrypt(byte[] code) throws Exception {
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] original = cipher.doFinal(code);
return original;
}
public synchronized double decryptDouble(byte[] code) throws Exception {
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] original = cipher.doFinal(code);
return doubleFromBytes( original);
}
Danke!
Frederik
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Polsterung ist ein schönes sanity-check. Vorausgesetzt, die falsch entschlüsselten Daten ist gleichmäßig verteilt, es erscheint nur richtig PKCS5/PKCS7-gepolsterte ungefähr 1 mal für jeden 255 falsche Passwörter. (1/256 + 1/256^2 + 1/256^3 ...)
Deshalb ist es hilfreich, aber es ist nicht etwas, sollten Sie sich auf --- was ist effektiv ein fast-8-bit-message-digest-ist kein ausreichender test der Integrität der Daten.
Eins noch: Wenn sich ein Angreifer kann immer wieder verändern, wird der Chiffretext, und bekommen Sie Sie zu entschlüsseln, (ein Beispiel ist die die verschlüsselten Daten in einem cookie gespeichert) und wenn Sie unterscheiden können zwischen Ihrem Verhalten, wenn die entschlüsselten Daten wirft eine Ausnahme für die schlechte Polsterung und Wann es einfach Müll, dann ermitteln Sie den Klartext über eine "padding oracle Attacke".
By the way, wenn Sie tatsächlich wollen das Verhalten, das Sie erwartet, können Sie mit "AES/CTR/NoPadding", die nicht erfordern eine genaue Blockgröße und immer wieder einer entschlüsselt, byte[], oder nicht, ob die Schlüssel übereinstimmen.
Sollten Sie entweder verwenden AES mit einer impliziten Polsterung Erklärung (siehe die verfügbaren Modi) oder zu zwingen, die Länge (in bytes) von Daten, die verschlüsselt/entschlüsselt werden auf ein Vielfaches von 16 sein.
Auch standardmäßig benutzt java ECB-Modus, die wirklich ungesichert, je nachdem, welche Art von Daten Sie verwenden, sollten Sie wahrscheinlich verwenden einen CBC-Modus.
NoPadding
, aber dann müssen Sie sicherstellen, dass Ihre Daten Länge ein Vielfaches der Blocklänge.PKCS5Padding
ist es das gleiche wie beschrieben in RFC 1423 für DES CBC.SecretKeySpec gibt einen geheimen Schlüssel in eine provider-unabhängige Mode
http://themasterofmagik.wordpress.com/2014/03/19/simple-aes-encryption-and-decryption-in-java/