![]() |
KryptologieMonoalphabetische Substitution in Perl |
|
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.
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
oder sogar noch kürzer:tr/ABCDEFGHIJKLMNOPQRSTUVWXYZ/QWERTZUIOPASDFGHJKLYXCVBNM/;
tr/A-Z/QWERTZUIOPASDFGHJKLYXCVBNM/;
Frage: Warum sollte man diese Permutation nicht als Schlüssel verwenden?
Das ganze fertige Programm einschließlich Standard-Ein- und -Ausgabe mit fest eingebautem Schlüssel sieht dann so aus:
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:while (<>) { # Read input line, tr/A-Z/QWERTZUIOPASDFGHJKLYXCVBNM/; # 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 /A-Z/$permut/"; # translate using key, print; # and print. }
$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. |
Um etwas mehr Freiheit bei der Eingabe und etwas mehr Struktur bei der Ausgabe zu haben, programmieren wir noch ein paar Hilfsroutinen:
Übungsaufgabe: Wie wird darin das oben genannte Sicherheitsproblem vermieden?
perl monoalph.pl schluessel < klar.txt > geheim.txt
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.