Cindy Kei
Dec 24, 2020 – 4 min read

The Caesar Cipher Encryptor jest następny w naszej serii algorytmów problem walkthroughs. Sklasyfikowany jako „łatwy” algorytm na stronach internetowych takich jak Leetcode, jest to kolejny klasyczny problem, który często pojawia się na rozmowach technicznych i jest dobrą praktyką dla każdego inżyniera oprogramowania, który chce podszlifować swoje umiejętności rozwiązywania problemów.

Src: IBM Community

Informacje ogólne

Na początek trochę informacji o szyfrze Cezara, żebyśmy wiedzieli, z czym mamy do czynienia.Szyfr Cezara jest prostym przykładem kryptografii, która jest definiowana przez Merriam-Webster jako: szyfrowanie i odszyfrowywanie wiadomości w tajnym kodzie lub szyfrze.

A także: komputerowe kodowanie i dekodowanie informacji.

Szyfr Cezara opiera się na transpozycji każdej litery ciągu znaków o określoną liczbę miejsc (klasycznie są to trzy) w alfabecie. Szyfr Cezara jest również znany jako szyfr przesunięcia, ponieważ obejmuje przesunięcie liter w celu ukrycia znaczenia wiadomości. Szyfr Cezara jest tak nazwany, ponieważ mówi się, że Juliusz Cezar i jego sojusznicy używali tej metody szyfrowania w celu przesyłania tajnych wiadomości dotyczących tajemnic wojskowych (IBM Z Security).

Src: Julius Caesar Study Guide

Caesar Cipher Encryptor

Teraz, gdy mamy już pewne tło na temat szyfru Cezara i sposobu jego działania, możemy przejść do przyjrzenia się rzeczywistemu problemowi algorytmu. Biorąc pod uwagę niepusty ciąg składający się z małych liter oraz klucz (nieujemną liczbę całkowitą), który określa, o ile miejsc w alfabecie przesunąć każdą literę w ciągu, naszym zadaniem jest napisanie funkcji, która zwróci zakodowany ciąg. Chcemy, aby litery zawijały się wokół alfabetu; z przesunięte o jedno miejsce powinno zwrócić literę a.

Pomyślmy teraz o problemie z koncepcyjnego punktu widzenia, zanim przejdziemy do kodu. Wiemy, że musimy systematycznie przesuwać każdą literę ciągu wejściowego o określoną liczbę miejsc. Jak możemy znaleźć sposób na mapowanie każdej litery na liczbę, tak abyśmy mogli konsekwentnie reprezentować każdą literę, a także łatwo przesuwać każdą literę o dany klucz? Moglibyśmy zrobić własne mapowanie liter na liczby, przechowując nasz system mapowania w obiekcie, gdzie kluczem jest liczba całkowita, a wartością odpowiadająca jej litera, ale czy istnieje prostsza metoda? Na szczęście dla nas, istnieje.

JavaScript, podobnie jak wiele innych języków programowania, posiada funkcję, która pozwala nam uzyskać wartość Unicode danej litery: charCodeAt(). Ta poręczna mała wbudowana funkcja pozwoli nam na efektywne stworzenie systemu mapowania dla alfabetu.

Okay, doskonale. Teraz, gdy mamy już nasz system mapowania, musimy pomyśleć o logistyce.

Zainicjalizujmy pustą tablicę, w której będziemy mogli przechowywać nasze wyniki – nazwiemy ją newLetters. Możemy iterować przez przekazany łańcuch i dla każdej litery łańcucha przekonwertować literę alfabetu na jej wartość unicode. Następnie możemy dodać klucz (liczba reprezentująca ile miejsc transponujemy naszą literę) do wartości unicode, aby uzyskać wartość unicode nowej litery. Następnie będziemy chcieli użyć wbudowanej w JavaScript funkcji String.fromCharCode(), aby przekonwertować wartości unicode z powrotem na łańcuchy. Jako ostatni krok, możemy wepchnąć nasze wyniki do tablicy newLetters, a następnie połączyć nasze elementy tablicy w pojedynczy łańcuch, aby uzyskać naszą ostateczną odpowiedź.

Things To Keep In Mind

Nie jest to strasznie skomplikowane, ale będziemy chcieli pamiętać o kilku ważnych rzeczach. Po pierwsze, warto wiedzieć, że wartość unicode dla a to 97, a wartość unicode dla z to 122. Nasze wartości unicode muszą być pomiędzy 97 a 122, aby zmieścić się w alfabecie.

Aby upewnić się, że nasze litery zawijają się wokół alfabetu (to znaczy, że z przesunięte o 1 pozycję to a), jeśli wartość unicode jest powyżej 122, użyjemy operatora modulo, aby zmusić ją do wartości poniżej 122. Ponieważ a jest równe 97, dodajemy liczbę wynikającą z użycia operatora modulo w poprzednim kroku do 96, aby otrzymać wartość odpowiadającą literze alfabetu.

Jako kolejne zabezpieczenie przed otrzymaniem dużej liczby, możemy również wymusić, aby klucz miał rozsądną wartość. Ponieważ alfabet angielski składa się z 26 liter, wiemy, że przesunięcie liter o 26 miejsc spowoduje, że znajdziemy się dokładnie w tym samym miejscu, w którym zaczęliśmy, co zniweczy cel szyfru. Możemy więc użyć operatora modulo, aby upewnić się, że klucz jest mniejszy niż 26.

Kod wynikowy

Teraz, gdy już przebrnęliśmy przez koncepcję rozwiązania, poświęć sekundę na zastanowienie się, jak to faktycznie zakodować. Wypróbuj to najpierw na własnej skórze. Nie szkodzi, jeśli twój kod jest niechlujny i nie tak suchy, jak byś chciał – najpierw zdobądź działające rozwiązanie, a potem możesz refaktoryzować i oczyszczać swój kod.

Tak wygląda mój kod:

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.