Implementiere eine einfache Verschiebechiffre wie die Caesar-Chiffre und eine sicherere Substitutionschiffre.
„Wenn er etwas Vertrauliches zu sagen hatte, schrieb er es in Chiffre, das heißt, er änderte die Reihenfolge der Buchstaben des Alphabets so, dass sich kein Wort herauslesen ließ. Wenn jemand diese entschlüsseln und ihre Bedeutung erfahren will, muss er den vierten Buchstaben des Alphabets, nämlich D, für A einsetzen, und ebenso mit den übrigen verfahren.“ – Suetonius, Leben des Julius Caesar
Chiffren sind sehr einfache Algorithmen, mit denen wir Text weniger lesbar machen können, während er sich weiterhin leicht entschlüsseln lässt. Sie sind anfällig für viele Formen der Kryptoanalyse, aber Caesar hatte Glück, dass seine Feinde keine Kryptoanalytiker waren.
Die Caesar-Chiffre wurde für einige Nachrichten von Julius Caesar verwendet, die ins Feld geschickt wurden. Caesar wusste, dass die Chiffre nicht besonders gut war, aber in dieser Hinsicht hatte er einen Verbündeten: Fast niemand konnte gut lesen. Selbst wenn die Verschiebung um ein paar Buchstaben danebenlag, reichte das aus, damit die Leute die wenigen Wörter, die sie kannten, nicht erkannten.
Deine Aufgabe ist es, eine einfache Verschiebechiffre wie die Caesar-Chiffre zu erstellen. Dieses Bild ist ein großartiges Beispiel für die Caesar-Chiffre:
![]()
Zum Beispiel:
Wenn du „iamapandabear“ als Eingabe an die encode-Funktion gibst, liefert sie die Chiffre „ldpdsdqgdehdu“. Verschleiert genug, um unsere Nachricht auf dem Transportweg geheim zu halten.
Wenn du „ldpdsdqgdehdu“ in die decode-Funktion gibst, liefert sie wieder das ursprüngliche „iamapandabear“ zurück, sodass dein Freund deine ursprüngliche Nachricht lesen kann.
Verschiebechiffren werden schnell nutzlos, wenn der gegnerische Befehlshaber sie durchschaut. Versuchen wir stattdessen eine Substitutionschiffre. Passe den Code so an, dass wir einen Schlüssel angeben und ihn als Verschiebungsdistanz verwenden können.
Hier ein Beispiel:
Mit dem Schlüssel „aaaaaaaaaaaaaaaaaa“ liefert das Verschlüsseln des Strings „iamapandabear“ wieder das ursprüngliche „iamapandabear“.
Mit dem Schlüssel „ddddddddddddddddd“ liefert das Verschlüsseln unseres Strings „iamapandabear“ das verschleierte „ldpdsdqgdehdu“.
Im obigen Beispiel haben wir a = 0 als Schlüsselwert gesetzt. Wenn der Klartext also zum Schlüssel addiert wird, kommt am Ende dieselbe Nachricht heraus. „aaaa“ ist also kein idealer Schlüssel. Wenn wir den Schlüssel aber auf „dddd“ setzen, erhalten wir dasselbe wie bei der Caesar-Chiffre.
Das schwächste Glied in jeder Chiffre ist der Mensch. Machen wir deine Substitutionschiffre etwas fehlertoleranter, indem wir eine Zufallsquelle bereitstellen und dafür sorgen, dass der Schlüssel nur Kleinbuchstaben enthält.
Wenn gar kein Schlüssel angegeben wird, erzeuge einen wirklich zufälligen Schlüssel mit mindestens 100 Kleinbuchstaben.
Verschiebechiffren machen den Text ein wenig seltsam, sind aber anfällig für Häufigkeitsanalysen. Substitutionschiffren helfen dagegen, sind aber weiterhin sehr anfällig, wenn der Schlüssel kurz ist oder Leerzeichen erhalten bleiben. Später siehst du in der Übung „crypto-square“ eine Lösung für dieses Problem.
Wenn du in diesem Bereich weiter gehen willst, beginnen die Fragen damit, wie wir Schlüssel auf sichere Weise austauschen können. Schau dir Diffie-Hellman auf Wikipedia an, eine der ersten Implementierungen dieses Verfahrens.
Versuche, Indizes mit arithmetischen Operationen wie modulo umzubrechen, wenn sie das Ende überschreiten. Auch die Klassen Character und String sind deine Freunde.
Melde dich bei Exercism an, um Pharo mit 50 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.