[JoGu]

Kryptologie

Monoalphabetische Substitution in Perl

a7Hzq .#5r<
kÜ\as TâÆK$
ûj(Ö2 ñw%h:
Úk{4R f~`z8
¤˜Æ+Ô „&¢Dø

Für die Programmierung der Verfahren der klassischen Kryptographie ist Perl als Programmiersprache besonders geeignet. Installationsfertige Perl-Interpreter für alle wichtigen Systeme gibt es [extern] hier. Wer nur das ausführbare Programm ohne Bibliotheken haben will (das reicht für diese Vorlesung) und unter MS-Windows arbeitet, kann sich auch hier bedienen - benötigt werden die drei Dateien perl.exe, perl.dll, cw3230mt.dll irgendwo im Suchpfad.

Einige Erläuterungen zu Perl (»Crash-Kurs«), die zum Verständnis der folgenden Programme beitragen sollen, gibt es hier.


Übersetzungstabellen in Perl

Perl gestattet eine sehr komfortable Behandlung von Zeichenketten. Insbesondere ist die monoalphabetische Chiffrierung als Operator tr eingebaut, der Zeichenketten nach einer gegebenen Übersetzungstabelle umwandelt (für ein Alphabet, das aus »druckbaren« ASCII-Zeichen besteht).

Beispiel: Die monoalphabetische Substitution

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Q W E R T Z U I O P A S D F G H J K L Y X C V B N M
beschreibt man mit der Perl-Anweisung
tr/ABCDEFGHIJKLMNOPQRSTUVWXYZ/QWERTZUIOPASDFGHJKLYXCVBNM/;
oder sogar noch kürzer:
tr/A-Z/QWERTZUIOPASDFGHJKLYXCVBNM/;

Frage: Warum sollte man diese Permutation nicht als Schlüssel verwenden?


Das fertige Programm - Einfachversion

Das ganze fertige Programm einschließlich Standard-Ein- und -Ausgabe mit fest eingebautem Schlüssel sieht dann so aus:

while (<>) {                          # Read input line,
  tr/A-Z/QWERTZUIOPASDFGHJKLYXCVBNM/; # translate using key,
  print;                              # and print.
  }
Um etwas mehr Freiheit zu gewinnen, stecken wir den Schlüssel noch in eine Variable; damit der tr-Operator richtig funktioniert, muss die Anweisung mit der eval-Funktion behandelt werden, die zur Laufzeit die richtige Übersetzungstabelle erzeugt:
$permut = "QWERTZUIOPASDFGHJKLYXCVBNM"; # Hard coded key
while (<>) {                          # Read input line,
  eval "tr /A-Z/$permut/";            # translate using key,
  print;                              # and print.
  }
Und gleich noch das zugehörige Entschlüsselungsprogramm:
$permut = "QWERTZUIOPASDFGHJKLYXCVBNM"; # Hard coded key
while (<>) {                          # Read input line,
  eval "tr/$permut/A-Z/";             # translate using key,
  print;                              # and print.
  }
Achtung! Dabei gibt es ein Sicherheitsproblem, auf das hier hingewiesen werden muss, da heutige Kryptologie-Studenten eventuell zukünftige professionelle Sicherheitsexperten sein werden:

Der Perl-Funktion eval - wie auch entsprechenden Funktionen in anderen Programmiersprachen - darf man nie eine Zeichenkette unbehandelt übergeben, insbesondere, wenn diese aus einem WWW-Formular stammt. Sonst kann ein bösartiger Nutzer etwa so etwas eingeben: abc/abc/;rm -rf *.*;tr/A-Z - und der Webmaster kriegt die Krise.

Ein bisschen mehr Komfort

Um etwas mehr Freiheit bei der Eingabe und etwas mehr Struktur bei der Ausgabe zu haben, programmieren wir noch ein paar Hilfsroutinen:

Das ganze wird in einen Modul auxcrypt.pl gesteckt, der als ganzes aufs Herunterladen wartet, ebenso wie monoalph.pl, das monoalphabetische Verschlüsselungsprogramm und monodecr.pl, das zugehörige Entschlüsselungsprogramm.

Übungsaufgabe: Wie wird darin das oben genannte Sicherheitsproblem vermieden?

Aufruf aus der Kommandozeile

perl monoalph.pl schluessel < klar.txt > geheim.txt

wobei schluessel durch ein Schlüsselwort, klar.txt durch den Dateinamen des Klartexts und geheim.txt durch den Dateinamen des Geheimtexts zu ersetzen ist.

Es gibt - sowohl unter Unix also auch unter MS-DOS - auch die Möglichkeit, Perl-Programme direkt ausführbar zu machen, Anleitung (in englisch) hier.

Aufruf auf dem Server per WWW-Formular


Autor: Klaus Pommerening, 29. September 1999; letzte Änderung: 31. Oktober 2004.