Erstelle eine Implementierung der Vigenère-Chiffre. Die Vigenère-Chiffre ist eine einfache Substitutionschiffre.
Eine Chiffre ist ein Algorithmus, mit dem ein String verschlüsselt, also kodiert, wird. Der unverschlüsselte String heißt Klartext, der verschlüsselte String heißt Geheimtext. Das Umwandeln von Klartext in Geheimtext nennt man Kodieren, das Umgekehrte Dekodieren.
Bei einer Substitutionschiffre wird jeder Buchstabe des Klartexts durch einen Buchstaben des Geheimtexts ersetzt, der mithilfe eines Schlüssels berechnet wird. (Beachte: Der Ersatzbuchstabe kann derselbe sein wie der ursprüngliche Buchstabe.)
In dieser Chiffre ist der Schlüssel eine Reihe von Kleinbuchstaben, wie zum Beispiel "abcd".
Jeder Buchstabe des Klartexts wird um eine Strecke verschoben oder rotiert, die auf einem entsprechenden Buchstaben im Schlüssel beruht.
Ein "a" im Schlüssel bedeutet eine Verschiebung von 0 (also keine Verschiebung).
Ein "b" im Schlüssel bedeutet eine Verschiebung von 1.
Ein "c" im Schlüssel bedeutet eine Verschiebung von 2, und so weiter.
Der erste Buchstabe des Klartexts verwendet den ersten Buchstaben des Schlüssels, der zweite Buchstabe des Klartexts den zweiten Buchstaben des Schlüssels, und so weiter. Wenn dir die Buchstaben im Schlüssel ausgehen, bevor die Buchstaben im Klartext ausgehen, beginnst du wieder am Anfang des Schlüssels.
Wenn der Schlüssel nur einen Buchstaben enthält, wie "dddddd", dann werden alle Buchstaben des Klartexts um denselben Betrag verschoben (in diesem Beispiel um drei). Damit entspricht er einer Rotationschiffre oder Verschiebechiffre (manchmal Caesar-Chiffre genannt).
Zum Beispiel würde aus dem Klartext "iamapandabear" der Geheimtext "ldpdsdqgdehdu".
Wenn der Schlüssel nur den Buchstaben "a" enthält (einmal oder mehrfach), ist die Verschiebung null und der Geheimtext ist derselbe wie der Klartext.
Meist ist der Schlüssel aber komplizierter!
Wenn der Schlüssel "abcd" ist, dann werden die Buchstaben des Klartexts um 0, 1, 2 und 3 verschoben.
Wenn der Klartext "hello" ist, brauchen wir 5 Verschiebungen, also würde der Schlüssel umlaufen und die Verschiebungen 0, 1, 2, 3 und 0 ergeben.
Wenden wir diese Verschiebungen auf die Buchstaben von "hello" an, erhalten wir "hfnoo".
Wenn kein Schlüssel angegeben wird, erzeuge einen Schlüssel, der aus mindestens 100 zufälligen Kleinbuchstaben des lateinischen Alphabets besteht.
Die Definition des Cipher-Interface steht in cipher.go.
Deine Implementierungen sollten dem Cipher-Interface entsprechen.
type Cipher interface {
Encode(string) string
Decode(string) string
}
Encode ignoriert alle Zeichen im String, die nicht A-Za-z sind; sie tauchen in der Ausgabe nicht auf.
Die Ausgabe wird außerdem auf Kleinbuchstaben normalisiert.
Die Funktionen zum Erzeugen der Chiffren sind:
func NewCaesar() Cipher { }
func NewShift(distance int) Cipher { }
func NewVigenere(key string) Cipher { }
Das Argument für NewShift muss im Bereich 1 bis 25 oder -1 bis -25 liegen.
Null ist nicht erlaubt.
Bei ungültigen Argumenten gibt NewShift nil zurück.
Das Argument für NewVigenere darf nur aus Kleinbuchstaben a-z bestehen.
Werte, die nur aus dem Buchstaben 'a' bestehen, sind nicht erlaubt.
Bei ungültigen Argumenten gibt NewVigenere nil zurück.
Melde dich bei Exercism an, um Go mit 35 Konzepte167 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.