XTEA und Blowfish

Kryptographie-Bibliotheken gibt es viele. OpenSSL libReSSL und Crypto++ sind wiederkehrende Weggefährten meines Programmieralltags.

Doch wenn es darum geht ohne Abhängigkeiten “ein bisschen” Sicherheit über Daten zu legen (z.B.: am Mikrocontroller), dann sind die genannten Moloche ungeeignet.

Hier greife ich dann gerne zu Blowfish oder XTEA.


Symmetrische Verschlüsselung ist generell nicht hoch-sicher, gemessen an asynchronen Verfahren, die aber auch schwer an Bit-Adipositas leiden.

Wer aber “nur” verhindern möchte, dass ein anderer seine Dateien lesen kann, erzeugt sich einen Schlüssel und lässt seine Daten damit umordnen, so dass man eben selbigen Schlüssel braucht, um das Ganze wieder lesbar zu machen.

Wie man diesen Schlüssel jetzt “gut aufbewahrt” ist eine andere Frage, um die es hier nicht gehen soll.

Blowfish

Der von Bruce Schneier stammende Blowfish arbeitet auf 64-bit Blöcken und verschränkt bzw. verschiebt Bits mit durch den Schlüssel generierten Datenblöcken, die man durch eine Umkehrfunktion wiederherstellen kann (siehe Feistelnetzwerk).

In Berührung gekommen bin ich mit Blowfish vor langer Zeit auf CodeProject als die “schnelle” Verschlüsselung von Daten mit einem festen einkompilierten Schlüssel in einem Projekt notwendig war.
Der dortige C++ Code hat leider den Fehler, dass er nicht Streaming-fähig ist, man kann also nicht stückweise die Daten an den En/Decoder verfüttern. Genau das war meine erste Änderung an dem Modul und nach vielen weiteren Iteration ist ein darauf aufbauender Code noch am GATE Projekt gelandet.

Zur Verifizierung des selbst überarbeiteten Codes nutze ich OpenSSL, das mit seinen BF_* APIs zum gleichen Ergebnis kommen muss.

ECB und CBC

Ich verstehe wenig von Kryptographie, doch durch die Befassung mit Blowfish wurde mir die ECB und CBC Varianten verständlich erklärt.
Beim Electronic CodeBook (ECB) wird der Datenstrom in Blöcke zerteilt und jeweils mit dem gleichen Schlüssel verknüpft. Das Ergebnis ist eine Kette von verschlüsselten (gleich großen) Blöcken, die leider nicht sehr sicher sind.

Im Wikipeda Artikel zeigt die Verschlüsselung eines Bildes, dass das Ergebnis noch erkennbar das Muster der Originaldaten aufweist.

Beim Cipher Block Chaining (CBC) wird ein zusätzlicher “Initialisierungsvektor” in Form von ein paar Bytes definiert (also wie ein Zusatz zum Hauptschlüssel), der mit den Eingangsdaten vor der Verschlüsselung verknüpft wird. Der neu erzeugte verschlüsselte Block wird dann mit dem darauffolgenden Eingangsblock verknüpft, bevor dieser verschlüsselt wird … usw. Nachdem jeder verschlüsselte Block einen Teil des Vorgängerblocks in sich trägt, ist das Ergebnis der gesamten Verschlüsselung “so zufällig”, dass man keine Muster mehr erkennen kann (zumindest nicht leicht).

Aus diesem Grund ist CBC das einzige Verfahren, dass man für Datenverschlüsselung nutzen sollte.

TEA, XTEA und XXTEA

Für Mikrocontroller ist Blowfish leider oft zu groß. Die wenigen nutzbaren Kilobytes würden von den Blowfish-Tabellen ausgefüllt werden, und deshalb suchte ich nach einer einfacheren Alternative.
Gefunden habe ich XTEA und seinen Nachfolger XXTEA.

Der Tiny Encryption Algorithm (kurz: TEA) verknüpft Blöcke von 64-bit Daten mit einem 128-bit Schlüssel.
TEA galt jedoch nicht als besonders sicher und so wurde sein Nachfolger XTEA ins Leben gerufen, welcher wiederum mit XXTEA verbessert wurde, der auch als “Corrected Block TEA” bekannt ist.

Während XTEA mehrere Verschlüsselungsrunden mit dem 128-bit Schlüssel auf jeden 64-bit Datenteilblock anwendet, verknüpft XXTEA alle aufeinanderfolgenden 64-bit Datenblöcke und verknüpft diese in mehreren Runden.

All TEA-Varianten sind als Public-Domain Code frei verfügbar und wegen ihrer geringen Größe auch für Mikrocontroller geeignet.
XTEA verbraucht nur 24 Bytes (8 für Daten, 16 für Schlüssel) um einen Block zu bearbeiten, womit man eine Nachricht in kleinen Teilstücken verschlüsseln kann.
XXTEA erhöht die Sicherheit nur dann, wenn man größere gepufferte Datenmengen in einem Schritt verschlüsselt. Soll heißen, am ATtiny mit 128 bis 512 Bytes RAM macht es keinen Sinn, aber mit mehr RAM und größeren Nachrichten stellt XXTEA ein gutes Verhältnis zwischen Sicherheit und Komplexität dar.

Fazit

Im GATE Framework sind Blowfish, XTEA und XXTEA implementiert. Zwar habe ich aktuell noch keine direkte Anwendung dafür, aber die Nutzung als “einfache” Verschlüsselung für Daten steht bereits auf meiner Wunschliste.

Denn wenn man z.B.: Passwörter oder URL speichern möchte, die nicht jeder Gastbenutzer gleich finden soll, dann hilft es sehr, diese verschlüsselt zu speichern.

Das ersetzt natürlich keinen guten Passwort-Manager, aber zumindest lässt man die Daten nicht fahrlässig im Klartext liegen. Und das ist zumindest mal ein Anfang.