Entschlüsseln Sie eine AES-verschlüsselte Nachricht (verschlüsselt in Python) in Java

Ich möchte eine AES-verschlüsselte Nachricht in Java entschlüsseln. Ich habe versucht, verschiedene Algorithmus / Mode / Padding Optionen aus der Standard-Bibliothek und von BouncyCastle . Kein Glück 🙁

Die verschlüsselte Entität ist in Python geschrieben und ist bereits in Produktion. Verschlüsselte Nachrichten sind bereits ausgegangen, also kann ich diesen Teil nicht leicht ändern. Der Python-Code sieht so aus:

from Crypto.Cipher import AES import base64 import os import sys BLOCK_SIZE = 16 PADDING = '\f' pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s))) DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING) secret = 'XXXXXXXXXXXXXXXX' cipher = AES.new(secret) clear='test' encoded = EncodeAES(cipher, clear) print 'Encrypted string:>>{}<<'.format(encoded) decoded = DecodeAES(cipher, encoded) print 'Decrypted string:>>{}<<'.format(decoded) 

Offensichtlich wird AES benutzt, und ich habe herausgefunden, dass ich den ECB-Modus benutzen muss. Aber ich habe keinen Padding-Modus gefunden, der auf der Java-Seite funktioniert. Wenn die Eingabe in die Blockgröße passt und keine Auffüllung passiert, kann ich die Nachricht in Java entschlüsseln. Wenn die Nachricht gepolstert werden muss, schlägt die Entschlüsselung fehl.

Der Java-Code zum Entschlüsseln sieht so aus:

 public class AESPaddingTest { private enum Mode { CBC, ECB, CFB, OFB, PCBC }; private enum Padding { NoPadding, PKCS5Padding, PKCS7Padding, ISO10126d2Padding, X932Padding, ISO7816d4Padding, ZeroBytePadding } private static final String ALGORITHM = "AES"; private static final byte[] keyValue = new byte[] { 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' }; @BeforeClass public static void configBouncy() { Security.addProvider(new BouncyCastleProvider()); } @Test public void testECBPKCS5Padding() throws Exception { decrypt("bEpi03epVkSBTFaXlNiHhw==", Mode.ECB, Padding.PKCS5Padding); } private String decrypt(String valueToDec, Mode modeOption, Padding paddingOption) throws GeneralSecurityException { Key key = new SecretKeySpec(keyValue, ALGORITHM); Cipher c = Cipher.getInstance(ALGORITHM + "/" + modeOption.name() + "/" + paddingOption.name()); c.init(Cipher.DECRYPT_MODE, key); byte[] decValue = c.doFinal(valueToDec.getBytes()); String clear = new String(Base64.encodeBase64(decValue)); return clear; } } 

Der Fehler ist geworfen:

Javax.crypto.IllegalBlockSizeException: Die Eingangslänge muss bei der Entschlüsselung mit gepolsterter Chiffre vielfach sein

Irgendwelche Ideen?

2 Solutions collect form web for “Entschlüsseln Sie eine AES-verschlüsselte Nachricht (verschlüsselt in Python) in Java”

Sie füllen sich mit Formular-Feed-Zeichen ( \f ). Ich bin mir nicht bewusst, ein Standard-Padding-Schema, das dies tut. Infolgedessen schlage ich vor, dass Sie sich für NoPadding auf der Java-Seite entscheiden und bereit sind, \f Zeichen aus dem Klartext zu NoPadding den Sie nach der Entschlüsselung erhalten.

Da Sie in der Lage sind, einen nicht gepolsterten Klartext zu entschlüsseln, dann zeigt es, dass Sie das gleiche Schlüsselmaterial auf beiden Seiten haben (was ein allgemeines Problem ist, dass ich froh bin, dass wir die Liste abschlagen können).

Beim Lesen der Python-Dokumentation sieht es aus, dass der ECB-Modus standardmäßig ausgewählt ist. So stellen Sie sicher, dass Sie dies auf der Java-Seite verwenden.

Danke für die gute Frage, Antwort und Kommentare. Ich habe kleine Änderungen an dem Code und jetzt funktioniert es wie ein Charme für mich.

 import java.security.GeneralSecurityException; import java.security.Key; import java.security.Security; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import android.util.Base64; public class AESTest { public enum Mode { CBC, ECB, CFB, OFB, PCBC }; public enum Padding { NoPadding, PKCS5Padding, PKCS7Padding, ISO10126d2Padding, X932Padding, ISO7816d4Padding, ZeroBytePadding } private static final String ALGORITHM = "AES"; private static final byte[] keyValue ="myKey".getBytes(); String decrypt(String valueToDec, Mode modeOption, Padding paddingOption) throws GeneralSecurityException { byte[] decodeBase64 = Base64.decode(valueToDec.getBytes(),0); Key key = new SecretKeySpec(keyValue, ALGORITHM); Cipher c = Cipher.getInstance("AES/ECB/NoPadding"); c.init(Cipher.DECRYPT_MODE, key); byte[] encValue = c.doFinal(decodeBase64); return new String(encValue).trim(); } } 

Dann habe ich die Klasse in meiner Android-Aktivität wie folgt verwendet:

 AESTest aes=new AESTest(); String decrypted = aes.decrypt(myCipheredText,Mode.ECB,Padding.NoPadding); 

Beachten Sie, dass das Geheimnis in Python-Code und Mykey in Java-Code sind die gleichen.

  • Verschlüsselte Datei oder db in python
  • Sicher verschlüsseln Sie ganzzahlige (bis zu 2 ^ 48) in den kürzesten URL-sicheren String
  • Passwortschutz Python
  • AES-Verschlüsselung in Node.js, um die erwartete Entschlüsselung in Python zu erfüllen
  • Verschlüsselung einer JPG-Datei mit picrypro's AES fehlgeschlagen
  • Wie man eine Datei mit Python verschlüsselt, aber mit der Shell entschlüsselt werden kann?
  • Verwenden von DPAPI mit Python?
  • Python - GPG entschlüsselt funktioniert aber GNUPG nicht
  • Python Caesar Cipher Decoder
  • Xlrd - Fehler "Arbeitsmappe ist verschlüsselt", Python 3.2.3
  • Vigenere Chiffre funktioniert nicht
  • Python ist die beste Programmiersprache der Welt.