Cipher: Was ist der Grund für IllegalBlockSizeException?

Habe ich beobachtet, dass Sie Folgendes, wenn ich arbeitete mit Chiffre.

Encryption-code:

Cipher aes = Cipher.getInstance("AES");
aes.init(Cipher.ENCRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());

Entschlüsselungs-code :

Cipher aes = Cipher.getInstance("AES");
aes.init(Cipher.DECRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());

Bekomme ich IllegalBlockSizeException ( Input-Länge muss ein Vielfaches von 16, wenn ...), läuft auf das Entschlüsseln von Codes.

Aber Wenn ich den code entschlüsseln zu

Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding"); //I am passing the padding too
aes.init(Cipher.DECRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());

Funktioniert es einwandfrei.
Ich verstehe, dass es in dem Muster algorithm/mode/padding. Also dachte ich, es ist, weil ich nicht erwähnte, ist die Polsterung. Also ich habe versucht, den Modus und die Polsterung während der Verschlüsselung

Encryption-code:

Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding");//Gave padding during encryption too
aes.init(Cipher.ENCRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());

Entschlüsselungs-code :

Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding");
aes.init(Cipher.DECRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());

Aber es funktioniert nicht mit IllegalBlockSizeException.

Was ist der Grund, warum die Ausnahme und was ist da genau passiert unterhalb.
Wenn jemand helfen kann? Vielen Dank im Voraus

UPDATE

Sieht aus wie das Problem mit dem string bin ich verschlüsseln und entschlüsseln. Da hat auch der code, dass ich sagte, funktioniert, funktioniert nicht immer. Ich bin grundsätzlich verschlüsseln UUIDs (zB : 8e7307a2-ef01-4d7d-b854-e81ce152bbf6). Es arbeitet mit bestimmten Zeichenfolgen und nicht mit bestimmten anderen.

Die Länge der verschlüsselten Zeichenfolge ist 64, die durch 16 teilbar. Ja, bei mir läuft es auf der gleichen Maschine.

Methode für geheime Schlüssel-Generierung:

    private Key generateKey() throws NoSuchAlgorithmException {
    MessageDigest digest = MessageDigest.getInstance("SHA");
            String passphrase = "blahbl blahbla blah";
    digest.update(passphrase.getBytes());
    return new SecretKeySpec(digest.digest(), 0, 16, "AES");
}
  • Was ist die Länge der Chiffretext erzeugt durch Ihre Verschlüsselungsmethode? Es sollte ein Vielfaches von 16 sein - wenn nicht, dann bitte Bearbeiten Sie die Frage mit all Ihren Verschlüsselungs-code, damit wir sehen können was falsch läuft. Auch dies ist wahrscheinlich nicht das Problem (ich nehme an du hast die Verschlüsselung und Entschlüsselung auf der gleichen Maschine), aber man sollte immer rawPassword.getBytes("UTF-8"), da verschiedene JVMs verwenden unterschiedliche Standard-Zeichenkodierungen.
  • Ich aktualisiert meine Antwort. Ja, ich sollte die übergabe der Codierung standard.
  • Funktioniert Ihr code konsistent fehlschlagen, mit einem Ihrer UUID-Werte? Wenn ja, bitte Editiere deine Frage, um zu zeigen, ein Stück code (eine SSCCE), nicht so, dass wir Experimentieren können.
InformationsquelleAutor shazinltc | 2013-04-24
Schreibe einen Kommentar