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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Während der Entschlüsselung, kann man nur bekommen eine
IllegalBlockSizeException
wenn die input-Daten ist nicht ein Vielfaches der Blockgröße (16 Byte für AES).Wenn der Schlüssel oder die Daten ungültig war (aber richtig in der Länge), erhalten Sie eine
BadPaddingException
weil die PKCS #5-padding falsch wäre im Klartext. Sehr gelegentlich die Polsterung wäre korrekt angezeigt durch Zufall, und Sie würden keine Ausnahme überhaupt.N. B. ich würde Ihnen empfehlen, geben Sie immer die Polsterung und mode. Wenn Sie nicht sind, haften Sie, überrascht zu sein, wenn der Anbieter die änderungen der Standardeinstellungen. Soweit ich weiß, die Sonne-Anbieter wandelt
"AES"
zu"AES/ECB/PKCS5Padding"
.javax.crypto.IllegalBlockSizeException ... stack trace ... Caused by: android.security.KeyStoreException: Key user not authenticated
bei Verwendung einesSecretKey
direkt geladen aus dem keystore statt, die sich auf ihn durch eineCryptoObject
wrapper, mit dem sich die Verwendung der-Taste.IllegalBlockSizeException
zeigt an, dass die Chiffretext ist nicht ein Vielfaches der Blockgröße. Üblicherweise bedeutet das, dass der Chiffretext wurde beschädigt oder ist im falschen format. Polsterung ist nur entfernt, wenn die Entschlüsselung erfolgreich war. Antwort vom OP bestätigt dies der Fall war.Obwohl ich noch nicht vollständig verstanden, die internals, die ich gefunden habe, was das Problem ist.
Ich hol den verschlüsselten string als GET-request-parameter. Als der string enthält unsichere Zeichen, die über die Anforderung der Schnur beschädigt wird. Die Lösung ist, zu tun, die URL-Codierung und Decodierung.
Ich bin in der Lage, um es erfolgreich zu tun mit der URLEncoder und URLDecoder.
Nun die Ergebnisse konsistent sind. Danke 🙂
Wäre ich dankbar, wenn jemand dazu beitragen kann, mehr auf dieses.