Billige Verschlüsselung knacken

Seite 3: Analyse der Verschlüsselung

Inhaltsverzeichnis

Doch wie arbeitet die Verschlüsselung? Das cttest-Chiffrat hat eine Periode von 24 Bytes, der Klartext hingegen sechs Bytes. Sechs ist ein Teiler von 24 und berücksichtigt man außerdem, dass blockbasierte Chiffren üblicherweise in Wortgrößen aus Zweierpotenzen arbeiten, ist eine Wortgröße von acht Byte – 64 Bit – wahrscheinlich. Denn 24 ist sowohl drei mal acht als auch vier mal sechs. Daraus ergibt sich folgende Ersetzungstabelle:

0000000000000000 -> 0000000000000000
6374746573746374 -> 5cf0d85c5cf44cb3
7465737463747465 -> d85c5cf45cf0de12
7374637474657374 -> 5cf45cf0d85c5cb3

Eine weitere Serie mit unterschiedlichen Testblöcken ergibt, dass die Kodierung unabhängig von der Blocknummer, der Position innerhalb eines Blockes sowie von der verwendeten PIN ist. Wir haben es also mit einer Funktion zu tun, die die Menge aller 64-Bit-Worte irgendwie verschwurbelt auf sich selbst abbildet. Diese Funktion muss ebenso wie ihre Umkehrfunktion -- die Enschlüsselung -- eindeutig sein, damit es keinen Datensalat gibt.

Wäre die Ersetzungstabelle bis auf die Null zufällig zusammengewürfelt, ergäbe sich durchaus noch eine halbwegs brauchbare Verschlüsselung, doch zum Speichern der vollständigen Tabelle würde gerade einmal der gesamte Speicherplatz der Menschheit ausreichen – keinesfalls der eines so kleinen Controllers. Es muss daher eine Rechenvorschrift geben, die die Verschlüsselungsfunktion vollständig beschreibt, sowie eine zugehörige Umkehrfunktion zum Entschlüsseln.

Bei einem kurzen Brainstorming in der Redaktion kommt die entscheidende Idee: Es könnte sich bei der Verschlüsselung um eine einfache lineare Funktion der Form

y = A · x

mit 64 Bit (für Mathematiker: in 64 Dimensionen) handeln. Umgestellt nach x ergibt sich die Entschlüsselungsfunktion:

x = A-1 · y

Die Meisten dürften diese Funktionen noch als Geradengleichung aus der Schule kennen, nur dass A in diesem Falle kein reeller Wert für die Steigung ist und A-1 dessen Kehrwert, sondern eine binäre 64×64-Matrix und deren Umkehrmatrix (inverse Matrix). Zum Knacken der Verschlüsselung müssen wir daher lediglich die Matrix A-1 herausbekommen, da sich mit ihrer Hilfe beliebiger Chiffretext in Klartext umrechnen lässt.

Der Clou dabei ist, dass uns der Controller diese Entschlüsselungsmatrix quasi frei Haus liefert, weil er Daten, die man direkt auf die SATA-Platte schreibt, dechiffriert, wenn man sie über das Gehäuseschnittstelle liest. Lax gesprochen schreibt man das Matrixäquivalent einer Eins auf die SATA-Platte und kann dann die Entschlüsselungsmatrix über das Gehäuse auslesen.

Für die konkrete Umsetzung braucht man etwas Lineare Algebra. Bei der Matrixmultiplikation übernehmen Einheitsmatrizen die Rolle der Eins als neutrales Element der Multiplikation. Sie besitzen ausschließlich auf der Hauptdiagonale Einsen, sonst überall Nullen. Für eine achtbittige lineare Funktion sieht die Einheitsmatrix wie folgt aus (in Klammern der jeweilige 8-Bit-Zeilenwert in hex):

00000001 (0x01)
00000010 (0x02)
00000100 (0x04)
00001000 (0x08)
00010000 (0x10)
00100000 (0x20)
01000000 (0x40)
10000000 (0x80)

Eine solche Einheitsmatrix muss man zeilenweise durch die Entschlüsselungsfunktion schicken, um dann auf der anderen Seite die Ergebniszeilen der gesuchten Matrix A-1 zu erhalten. Würde die Verschlüsselungsfunktion mit Bytes (8-Bit-Worten) arbeiten, wäre die Byte-Folge 01 02 04 08 10 20 40 80 zu entschlüsseln. Angenommen, das Ergebnis lautet 42 01 0E 04 40 91 20 55, so wäre die gesuchte Matrix:

01000010 (0x42)
00000001 (0x01)
00001110 (0x0E)
00000100 (0x04)
01000000 (0x40)
10010001 (0x91)
00100000 (0x20)
01010101 (0x55)