Der Caesar Cipher Encryptor ist der nächste in unserer Serie von Algorithmus-Problem-Walkthroughs. Dieser Algorithmus, der auf Websites wie Leetcode als „einfach“ eingestuft wird, ist ein weiteres klassisches Problem, das häufig in technischen Vorstellungsgesprächen auftaucht und eine gute Übung für jeden Software-Ingenieur ist, der seine Problemlösungsfähigkeiten auffrischen möchte.
Hintergrundinformationen
Zunächst einige Hintergrundinformationen zur Cäsar-Chiffre, damit wir wissen, womit wir es zu tun haben.Die Caesar-Chiffre ist ein einfaches Beispiel für Kryptographie, die von Merriam-Webster wie folgt definiert wird: die Verschlüsselung und Entschlüsselung von Nachrichten in einem geheimen Code oder einer Chiffre.
Auch: die computergestützte Verschlüsselung und Entschlüsselung von Informationen.
Die Caesar-Chiffre basiert auf der Verschiebung jedes Buchstabens einer Zeichenkette um eine bestimmte Anzahl von Stellen (der Klassiker ist drei) im Alphabet. Die Caesar-Chiffre wird auch als Shift-Chiffre bezeichnet, da sie die Verschiebung von Buchstaben beinhaltet, um die Bedeutung der Nachricht zu verschleiern. Die Cäsar-Chiffre heißt so, weil Julius Cäsar und seine Verbündeten diese Verschlüsselungsmethode benutzt haben sollen, um geheime Nachrichten mit militärischen Geheimnissen zu versenden (IBM Z Security).
Caesar Cipher Encryptor
Nachdem wir nun etwas Hintergrundwissen über die Caesar-Chiffre und ihre Funktionsweise haben, können wir uns nun dem eigentlichen Problem des Algorithmus zuwenden. Bei einer nicht leeren Zeichenkette aus Kleinbuchstaben und einem Schlüssel (eine nicht negative ganze Zahl), der angibt, um wie viele Stellen im Alphabet jeder Buchstabe in der Zeichenkette verschoben werden soll, besteht unsere Aufgabe darin, eine Funktion zu schreiben, die die verschlüsselte Zeichenkette zurückgibt. Wir wollen, dass die Buchstaben das Alphabet umschließen; z
um eine Stelle verschoben soll den Buchstaben a
zurückgeben.
Betrachten wir das Problem von einem konzeptionellen Standpunkt aus, bevor wir uns an den Code machen. Wir wissen, dass wir jeden Buchstaben der Eingabezeichenkette systematisch um eine bestimmte Anzahl von Stellen verschieben müssen. Wie können wir einen Weg finden, jeden Buchstaben auf eine Zahl abzubilden, so dass wir jeden Buchstaben konsistent darstellen und auch leicht jeden Buchstaben um den gegebenen Schlüssel verschieben können? Wir könnten unsere eigene Zuordnung von Buchstaben zu Zahlen vornehmen, indem wir unser Zuordnungssystem in einem Objekt speichern, bei dem der Schlüssel eine ganze Zahl und der Wert der entsprechende Buchstabe ist, aber gibt es eine einfachere Methode?
JavaScript hat, wie viele andere Programmiersprachen auch, eine Funktion, mit der man den Unicode-Wert eines Buchstabens ermitteln kann: charCodeAt()
. Mit dieser praktischen kleinen eingebauten Funktion können wir effizient ein Zuordnungssystem für das Alphabet erstellen.
Okay, perfekt. Nun, da wir unser Zuordnungssystem geordnet haben, müssen wir uns Gedanken über die Logistik machen.
Lassen Sie uns ein leeres Array initialisieren, in dem wir unsere Ergebnisse aufbewahren können – wir nennen dieses Array newLetters
. Wir können durch die übergebene Zeichenkette iterieren und für jeden Buchstaben der Zeichenkette den Buchstaben des Alphabets in seinen Unicode-Wert umwandeln. Anschließend können wir den Schlüssel (die Zahl, die angibt, um wie viele Stellen wir unseren Buchstaben transponieren) zum Unicode-Wert hinzufügen, um den Unicode-Wert des neuen Buchstabens zu erhalten. Dann wollen wir die in JavaScript eingebaute Funktion String.fromCharCode()
verwenden, um die Unicode-Werte wieder in Strings zu konvertieren. Als letzten Schritt können wir unsere Ergebnisse in das Array newLetters schieben und dann unsere Arrayelemente zu einer einzigen Zeichenkette zusammenfügen, um unsere endgültige Antwort zu erhalten.
Zu beachtende Dinge
Nicht furchtbar kompliziert, aber wir sollten ein paar wichtige Dinge im Hinterkopf behalten. Zunächst ist es hilfreich zu wissen, dass der Unicode-Wert von a
97 und der Unicode-Wert von z
122 ist. Unsere Unicode-Werte müssen zwischen 97 und 122 liegen, um innerhalb des Alphabets zu bleiben.
Um sicherzustellen, dass unsere Buchstaben das Alphabet umschließen (d. h. ein um eine Position verschobenes z ist ein a), verwenden wir den Modulo-Operator, wenn ein Unicode-Wert über 122 liegt, um ihn auf einen Wert unter 122 zu zwingen. Da a
gleich 97 ist, addieren wir die Zahl, die sich aus der Verwendung des Modulo-Operators im vorherigen Schritt ergibt, zu 96, um einen Wert zu erhalten, der einem Buchstaben des Alphabets entspricht.
Als weitere Absicherung gegen eine große Zahl können wir den Schlüssel auch in eine überschaubare Zahl zwingen. Da das englische Alphabet aus 26 Buchstaben besteht, wissen wir, dass eine Verschiebung der Buchstaben um 26 Stellen uns genau an die gleiche Stelle bringt, an der wir angefangen haben, was den Zweck der Chiffre zunichte macht. Wir können also den Modulo-Operator verwenden, um sicherzustellen, dass der Schlüssel kleiner als 26 ist.
Ergebniscode
Nachdem wir nun das Konzept der Lösung durchgespielt haben, nehmen Sie sich einen Moment Zeit, um darüber nachzudenken, wie man das Ganze tatsächlich codiert. Probieren Sie es zuerst selbst aus. Es ist in Ordnung, wenn dein Code unordentlich und nicht so trocken ist, wie du es gerne hättest – du solltest zuerst eine funktionierende Lösung finden und dann kannst du deinen Code überarbeiten und aufräumen.
So sieht mein Code aus: