In diesem Artikel veröffentliche ich die ARIBAS Skripte zu zwei einfachen kryptografischen Verfahren, die ich im letzten Semester programmiert habe. Dabei handelt es sich um die Base64 Kodierung und die Affine-Chiffre (inkl. Ciphertext-Only-Attack). Der Interpreter von ARIBAS ist an Pascal angelehnt und der Funktionsumfang dient zahlentheoretischen Berechnungen, insbesondere der Langzahlarithmetik (Primfaktorzerlegung etc.). Wer im Informatik Studium irgendwann auf Zahlentheorie bzw. Kryptografie stößt, sollte also einen Blick auf ARIBAS werfen. ![]()
Base64
Grundlagen:
Base64 ist ein sehr einfaches kryptografisches Verfahren. Es dient der Verschlüsselung von beliebigen 8-Bit Binärdaten in 6-Bit ASCII-Zeichenfolgen. Der reduzierte ASCII-Zeichensatz kann also nur aus 64 ASCII-Zeichen (6-Bit) bestehen: 0 – 63. Daher rührt auch der Name Base64. Ein gutes Anwendungsbeispiel für Base64 ist der Versand von Emails mit beliebigen Anhängen. Die Anhänge werden idR auch heutzutage noch nach dem Base64 Verfahren kodiert, denn das “Simple Mail Transfer Protocol” SMTP war einst nur für den Transfer von ASCII Zeichenketten entworfen. Für das Verständnis zu Base64 sind Vorkenntnisse über die ASCII-Zeichenkodierung notwendig.
Im Base64 Verfahren werden also drei 8-Bit Zeichen in vier 6-Bit Zeichen überführt: 3 x 8 = 4 x 6 = 24 Bit. Falls der 8-Bit Input-String kein Teiler von Drei ist, wird die Zeichenkette einfach um entsprechend vielen Nullen (Index ’0′ entspricht dem ASCII-Zeichen ‘A’) gefüllt (auch Padding genannt). Im kodierten Base64 String werden jene ‘A’-Zeichen am Ende der Zeichenkette durch ‘=’-Zeichen ersetzt, um die Dekodierung zu ermöglichen. Damit die Teilbarkeit durch 3 ermöglicht wird, brauchen nie mehr als maximal zwei Paddingzeichen angehängt werden.
Beide Prozeduren (Kodierung und Dekodierung) wurden in einem kleinen ARIBAS Skript umgesetzt: b64_coder.ari
Ausführung mit ARIBAS:
ARIBAS liefert von Haus aus viele nützliche Funktionen für die Kryptografie. Es gibt zum Beispiel eine Funktion zur Berechnung des größten gemeinsamen Teilers: ggt(). Damit der ARIBAS-Interpreter das neue Base64 Skript kennt, muss es zuvor geladen werden. Über den Reiter File->Load wird der Pfad zum Skript angegeben. Erscheint in der Konsole true ist das Skript geladen und kann direkt ausgeführt werden. Folgender Prompt-Befehl kann verwendet werden, um die geladene Funktion b64Encoder für die Base64 Kodierung auszuprobieren:
==> b64Encoder("Hallo Base64!").
Der Punkt am Ende gehört zur Syntax und schließt den Ausdruck ab. Analog dazu, führt folgender Befehl die Dekodierung des Base64 kodierten Strings aus:
==> b64Decoder("SGFsbG8gQmFzZTY0IQ==").
Die Prozeduren geben dabei diverse Hilfsvariablen in der Konsole aus, um das Programm besser nachvollziehen zu können.
Affine Chiffre
Grundlagen:
Die Affine Chiffre ist eine Blockchiffre, die auf jedes Zeichen eine affine Transformation ausführt. Folgende allgemeine Formel wird für die Verschlüsselung angewendet:
y := a * x + b (mod n)
Wobei Die Variable y das verschlüsselte Zeichen enthält. Die Klartextzeichen werden durch die Variable x repräsentiert. Die Konstante n entspricht der verwendeten Buchstabenmenge des entsprechenden Alphabets. Im Skript sind es 95, also die Anzahl der ASCII-Zeichen von Space (32) bis Tilde (126). Die ersten 32 Zeichen sind irrelevant, da dies nur Steuerzeichen sind.
Weiterhin muss der Koeffizient a Element Der Buchstabenmenge n sein und der größte gemeinsame Teiler von a und n ist gleich 1. Also müssen a und n teilerfremd zueinander sein! Die folgende Formel dient zur Entschlüsselung:
x := c * y – d (mod n)
Die Koeffizienten verhalten sich folgendermaßen zueinander:
c := a^-1 (mod n), d := a^-1 * b (mod n)
Mit a^-1 ist das Modulo Inverse Element von a gemeint! Dementsprechend ist c das Modulo Inverse Element von a. Zusätzlich ist d das Modulo Inverse Element von a multipliziert mit b. Sämtliche Rechnungen sind anschließend Modulo n zu berechnen.Ausführung mit ARIBAS:
Die Achillesferse der Affinen Chiffre ist die zeichenweise Anwendung einer festen affinen Transformation auf den kompletten Text. Das heißt, gleiche Zeichen bleiben auch im Ciphertext gleich. Durch die Anwendung einer Häufigkeitsanalyse können die Koeffizienten a,b,c und d errechnet werden, sofern der vorliegende Ciphertext lang genug ist. Die Häufigkeitsanalyse Im Skript, bezieht sich auf die deutsche Sprache und verwendet zur Auswertung nur die 5 häufigsten Zeichen: Space, e, n, i und s. Das Skript zur Affinen Chiffre steht unter folgendem Link zur Verfügung: affine_chiffre.ari
Nachdem das Skript geladen ist, stehen folgende Funktionen zur Verfügung: encrypt(), decrypt() und attackAffineCipher(). Folgender Prompt-Befehl verschlüsselt einen beispielhaften Text, der zum Knacken möglichst viele ‘e’ oder Leerzeichen enthalten sollte:
==> encrypt("besonders viele e zeichen im text").
Auf den erhaltenen Ciphertext kann nun die Ciphertext-Only-Attacke ausgeführt werden. Beispielsweise mit folgendem Ciphertext.
==> attackAffineCipher("fPhFmwP0hoRrP\PoPotPr?:Pmor5oAPcA").
Anschließend muss man nur noch die möglichen Ergebnisse nach ihrer Sinnhaftigkeit evaluieren. Dies kann auch durch das Programm geschehen, indem es nach typischen Zeichenreihen einer bestimmten Sprache sucht (sogenannte Bigramme der dt. Sprache zum Beispiel). Außerdem könnte man im Sinne von Bruteforce das Programm solange mit monoton fallenden Häufigkeitskombinationen suchen lassen, bis es fündig wird oder abbricht. Wer will kann das Skript ja damit erweitern
Jim
