G02 AES CBC-Tampering

Im nachfolgenden Beispiel zeige ich Euch, das die beste Verschlüsselung überlistet werden kann, wenn Ihr nicht zusätzliche Sicherungsmaßnahmen nutzt.

Ich arbeite in den beiden Programmen G02a und G02b mit exakt denselben Programmroutinen wie im Beispiel B09c AES MODUS CBC PKCS5PADDING ZUFALLS-INITVEKTOR DATEI INFILE-INITVECTOR, allerdings habe ich die Verschlüsselungsroutine in den Programmteil G02a und die Entschlüsselungsroutine in den Programmteil G02b geschoben, um die typische Situation „Der Absender verschlüsselt eine Nachricht“ (= G02a) und „Der Empfänger entschlüsselt diese Nachricht“ (=G02b) abzubilden. Sofern beide Programme hintereinander ausgeführt werden, wird die Demonstrationsdatei g02_test.txt zuerst in die Datei g02_test.enc verschlüsselt und durch das Programm G02b in die Datei g02_test.dec entschlüsselt.

Bis hierhin ist alles in Ordnung – aber was passiert wenn die verschlüsselte Datei g02_test.enc auf ihrem Weg zum Empfänger abgefangen und verändert wird ? In meinem Beispiel kennt der Mann in der Mitte (der böse „man in the middle“) den grundsätzlichen Aufbau der Mailnachricht, weil er vielleicht selber schon eine derartige Auftrags-Nachricht erhalten hat.

Wenn Ihr dieses simuliert und zuerst die verschlüsselte Nachricht erzeugt (G02a), dann die Veränderungsroutine („Tampering“) per G02c aufruft und am Ende dann schaut, welche Nachricht beim Empfänger entschlüsselt wird (G02b) dann ahnt Ihr, was am Ende passiert. Hier die Kurzversion – es entsteht ein Schaden in Höhe von 8.500 Euro:

Original Auftragstext: „Eilauftrag: 1000 EUR an das JavaCrypto-Konto ueberweisen.“
Verfälschter Auftragstext: „Eilauftrag: 9500 EUR an das JavaCrypto-Konto ueberweisen.“

Was ist das Besondere an diesem Angriff ? Wir greifen hier nicht die Verschlüsselung selber an (daher findet Ihr nirgendwo in G02c eine Ver- oder Entschlüsselungsroutine), sondern das CBC-Verfahren und den Initialisierungsvektor. Durch eine geschickte doppelte XOR-Kodierung wird erreicht, das die Entschlüsselung genau das Resultat erzeugt, was der Angreifer haben wollte. Die dafür notwendige Programmzeile findet in der Zeile 82 von G02c. Simpel, nicht wahr ?

Das Fazit aus diesem super einfachen Angriff ? Neben der Verschlüsselung ist es auch sehr wichtig, das die erhaltene Nachricht so auch Absender verschickt worden ist. Einige Lösungen findet Ihr im Kapitel F Nutzung von Hashes oder Ihr nutzt gleich einen Verschlüsselungsmodus, welcher diese Prüfung mit übernimmt. Die Beispiele B12 und höher arbeiten mit dem GCM-Modus und bieten genau diese zusätzliche Sicherheit.

Hier nun die Verschlüsselungsroutine:

mit Ihrer Konsolenausgabe:

Das ist die reine Entschlüsselungsroutine:

Auch hier die Konsolenausgabe:

Nun die Veränderungsroutine (Tampering):

Die Konsole zeigt lapidar:

Nun rufen wir noch einmal das Programm G02b auf und schauen dann in die Konsolenausgabe:

Alle Quellcodes zu den Unsicherheiten findet Ihr zum Download in meinem Github-Repository, welches Ihr über diesen Link erreicht: https://github.com/java-crypto/G-Unsicherheit. Alle Programme sind sowohl unter Java 8 als auch unter Java 11 lauffähig.

Die Lizenz zum obigen Beispiel findet Ihr auf der eigenen Lizenz-Seite.

Letzte Aktualisierung: 13.01.2019