Verschlüsselung/Entschlüsselung mit AES/ECB/NoPadding
Folgenden sind meine ver - /entschlüsseln-Methoden:
private String decrypt_data(String encData)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException
{
String key = "bad8deadcafef00d";
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
System.out.println("Base64 decoded: "+Base64.decode(encData.getBytes()).length);
byte[] original = cipher.doFinal(Base64.decode(encData.getBytes()));
return new String(original).trim();
}
private String encrypt_data(String data)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException
{
String key = "bad8deadcafef00d";
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
System.out.println("Base64 encoded: "+ Base64.encode(data.getBytes()).length);
byte[] original = cipher.doFinal(Base64.encode(data.getBytes()));
return new String(original);
}
So, jetzt, wenn ich versuche zu verschlüsseln, bekomme ich diese exception:
javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes
at com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:854)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:828)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313)
at javax.crypto.Cipher.doFinal(Cipher.java:2087)
Habe ich versucht mit cipher Instanz AES/ECB/PKCS5Padding
sowohl verschlüsseln und decrpt. Es funktioniert nur für die Verschlüsselung und nicht zur Entschlüsselung. Ich nehme an, die Polsterung ist notwendig, da die Daten-Größe ist nicht Vielfaches von 16bytes. 'Daten' byte-Länge gedruckt 152
so versucht Anhängen eight
\0
Zeichen zu Daten und dann zu verschlüsseln, es hat nicht funktioniert.
- check stackoverflow.com/questions/10836139/...
- Erstes problem: Sie sind Konvertierungen zwischen Binärdaten und text in der komplett falsche Weg. Sie sollten mit
String.getBytes
mit einer bestimmten Zeichencodierung (ich empfehle UTF-8), um es zu verschlüsseln, und dann brauchen Sie nicht zu base64-das Ergebnis der Verschlüsselung. Ihr call ofnew String(original)
wird versuchen, zu behandeln undurchsichtig binäre Daten, als wenn es text in der Standard-Kodierung. Das ist nicht gut zu gehen. - Warum geben Sie die bytes durch den base64 encode/decode vor dem verschlüsseln/entschlüsseln?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sah ich einen anderen Fehler in deinem code :
Selbst wenn Ihre Verschlüsselung Methode get die Arbeit, Sie sind Entschlüsselungs-Methode ist nicht zur Arbeit gehen.
In der Tat sind Sie die Verschlüsselung mithilfe der Base64-gefolgt bye AES. Und Sie entschlüsseln die ganze Sache mithilfe der Base64-gefolgt von AES.
Bin ich mir fast sicher, dass diese Art der Verschlüsselung nicht exchangeables.
(Sie müssen entschlüsseln von AES dann Base64).
Angesichts dieser Antwort : javax.crypto.IllegalBlockSizeException : Eingabe der Länge muss ein Vielfaches von 16 beim entschlüsseln mit gepolsterten cipher
ohne die Verwendung von padding (NoPadding arg), müssen Sie verwenden eine input-Zeichenkette mit einer Länge eines vielfachen von 16.
Wenn wir richtig den code mit meiner Bemerkung und wenn wir die Chiffre-Verwaltung der Polsterung, wir bekommen den folgenden code, der funktioniert gut :
Um Ihr spezifisches problem, ich denke Sie müssen nur fügen Sie den 8-Byte-Auffüllung, wie Sie versuchte, sondern etwas, das gültig ist in einen java-string (wie Leerzeichen) statt.