XTEA und Blowfish
« | 07 Aug 2022 | »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.