Cryptography Engineering, Teil 2: AES auf PCs und Servern

Seite 4: Build des Beispiels

Inhaltsverzeichnis

Die Beispielimplementierung ist auf einer breiten Palette von Zielsystemen lauffähig. Der Build auf Unix und Unix-ähnlichen Systemen kann durch Verwendung der GNU Autotools erfolgen. Der Code ist auf den klassischen Unix-Derivaten, wie AIX, HP/UX, Tru64 UNIX, (Open)Solaris und BSD, sowie Linux und GNU/Hurd ebenso lauffähig wie auf Betriebssystemen mit POSIX/UNIX-Addons wie dem Mainframe mit z/OS UNIX System Services und Windows mit Cygwin. Zusätzlich lässt sich das Beispiel durch separate Build-Skripte unter Windows mit Visual Studio, unter OpenVMS mit HP C++ und sogar unter OS/2 beziehungsweise eComStation mit OpenWatcom kompilieren und linken. Näheres zum Build auf den jeweiligen Plattformen findet sich in der Datei README des Distributions-Tarballs.

Auf jedem – entweder per GNU Autotools oder separatem Build-Skript – unterstützten System lässt sich in jedem Fall das Beispielprogramm aes32bit kompilieren und linken. Das Kommandozeilenprogramm füllt die AES-Implementierung mit Leben. aes32bit findet sich nach dem Build im Unterverzeichnis src der entpackten Distribution.

Das Programm unterscheidet zwischen zwei Modi: Textmodus und Binärmodus. Im Textmodus liest die Anwendung beim Verschlüsseln Zeilen von cin. Diese Zeilen werden bei Bedarf mit Nullzeichen auf die 16-Byte-Grenze aufgefüllt, verschlüsselt und das Kryptogramm als hexadezimaler String auf cout ausgegeben. Beim Entschlüsseln liest die Anwendung Kryptogramme als hexadezimale Strings über cin ein, entschlüsselt diese und gibt die so erhaltenen Strings auf cout aus. Ein einfacher Test dieses Modus lässt sich in der Unix-Shell wie folgt erreichen:

./aes32bit -ek 00112233445566778899aabbccddeeff | ./aes32bit -dk 00112233445566778899aabbccddeeff

oder unter Windows und OS/2 beziehungsweise eComStation in der Eingabeaufforderung:

aes32bit.exe -ek 00112233445566778899aabbccddeeff | aes32bit.exe -dk 00112233445566778899aabbccddeeff

oder unter OpenVMS in der DCL-Kommandozeile, wenn aes32bit als Command-Verb definiert ist:

define/user sys$output crypto.txt
aes32bit -ek 00112233445566778899aabbccddeeff
define/user sys$input crypto.txt
aes32bit -dk 00112233445566778899aabbccddeeff
delete crypto.txt;*

Eine direkte Pipe führt unter dem DCL des OpenVMS leider zu einem Stackdump. Alternativ lässt sich jedoch die Unix-Shell der GNV-Umgebung nutzen, um das obige Unix-Pipe-Kommando auch unter OpenVMS auszuführen.

Über das Flag -k erhält aes32bit den AES-Schlüssel als hexadezimalen Wert. In den Beispielen kommt ein 128-Bit-Schlüssel zum Einsatz. -e und -d schalten das Programm in den Ver- beziehungsweise Entschlüsselungsmodus. Alle Eingaben, die man jetzt auf der Standardeingabe auf den ersten Prozess schickt, verschlüsselt dieser und schickt das Kryptogramm in die Pipe. Der zweite Prozess erhält das Kryptogramm über die Pipe, entschlüsselt es wieder und gibt den Klartext aus. Die Ausgabe ist unspektakulär und wirkt wie ein simples Echo, zeigt jedoch, dass das Programm funktioniert. Man merkt das, wenn man den Schlüssel auf der einen oder anderen Seite der Pipe ändert, denn dann erhält man kryptische Zeichen, da die Entschlüsselung mit dem falschen Schlüssel erfolgt.

Das scheinbare Echo ist in Wahrheit keines. Vergleicht man die Ausgaben mit Eingaben, gibt es Differenzen. Die sind beim Entschlüsseln des Kryptogramms auf das Auffüllen mit Nullbytes, um die Blocklänge zu erreichen, zurückzuführen. Die angehängten Nullbytes sind auch in der Ausgabe vorhanden.

Höchst unwillkommen ist es, Dateien über den Textmodus zu verschlüsseln, denn beim Entschlüsseln würden abweichende Dateien entstehen. Gerade bei binären Daten führt dies zu unbrauchbaren Dateien. Daher unterstützt das Beispiel auch einen binären Modus, der beim Verschlüsseln keine einzelnen Zeilen liest, sondern 128-Bit-Blöcke. Die verschlüsselt das Programm Block für Block. Beim Entschlüsseln entsteht damit wieder dasselbe Abbild; ebenfalls Block für Block. Lediglich der letzte Block der Datei ist kritisch. Er enthält – durch das notwendige Auffüllen mit (Null-)Bytes – mehr Daten als die ursprüngliche Datei. aes32bit fügt daher noch einen weiteren Block an die Ausgabe an, der festhält, wie viele Bytes der letzte (zur Datei gehörende) Block enthielt. Mit Hilfe dieser Option lässt sich beim Entschlüsseln auch die Länge der Datei rekonstruieren und damit ein exaktes Ebenbild der ursprünglichen Datei erzeugen.

Mit Hilfe der Option -b lässt sich der Binärmodus zuschalten. Die Eingabe kann hier mittels -f aus einer Datei lesen und die Ausgabe durch -o in eine Datei schreiben. Zusätzlich finden sich noch diverse Optionen zum Einstellen des Betriebsmodus und zum Setzen des IV bei aes32bit. Eine kurze Hilfe gibt das Programm aus, wenn entweder gar keine Argumente übergeben werden, oder -h in der Kommandozeile vorhanden ist.

Der Build kann mit oder ohne CppUnit erfolgen. Auf manchen Plattformen, auf denen kein CppUnit zur Verfügung steht und eine Portierung für diesen Beitrag unverhältnismäßig wäre, ist ein Build grundsätzlich nur ohne CppUnit möglich. Hierzu zählen beispielsweise OpenVMS und OS/2 beziehungsweise eComStation. Auf Betriebssystemen, auf denen CppUnit verfügbar und installiert ist, lassen sich folgende Testprogramme erstellen:

  • aes32keytest führt die Schlüsselkonvertierungstests aus.
  • aes32metest führt den Test der AES-Teilfunktionen aus.
  • aes32kat führt die Known-Answer-Tests (KAT) aus.

Alle drei Programme finden sich nach dem Build im Unterverzeichnis tests und erwarten keinerlei Argumente auf der Kommandozeile.