Szyfr Cezara – jak zrobić szyfrowanie i dekodowanie oraz implementacje

Czy kiedykolwiek zastanawiałeś się, jak starożytne kultury zabezpieczały swoje tajne wiadomości? W tym artykule dowiesz się, czym jest Szyfr Cezara, jak działa i czy nadal jest wykorzystywany.

Translator Szyfru Cezara online – koder/dekoder

Szyfr Cezara






Wynik
  • Alfabet:
  • Alfabet przestawiony:
  • Komunikat:
  • Rezultat:

Co to jest Szyfr Cezara?

Szyfr Cezara to jedna z najprostszych metod szyfrowania tekstu, w której każda litera w tekście jawnym jest przesuwana o stałą liczbę pozycji w alfabecie. W praktyce oznacza to, że litery są zastępowane innymi literami znajdującymi się kilka miejsc dalej w alfabecie.

Na przykład, jeśli użyje się przesunięcia o 3 pozycje, litera “A” zostanie zaszyfrowana jako “D”, “B” jako “E” i tak dalej. Ten rodzaj szyfru nazywany jest szyfrem podstawieniowym, ponieważ każda litera jest zamieniana na inną.

Historia Szyfru Cezara sięga starożytnego Rzymu, a Juliusz Cezar miał być jednym z pierwszych znanych jego użytkowników. Legenda głosi, że Cezar używał przesunięcia o 3 pozycje, aby przesyłać wiadomości do swoich przyjaciół. W tamtych czasach ten szyfr stanowił znaczną przewagę względem osób, które starały się uzyskać poufne informacje, a które nie znały się nawet na tego typu kodowaniu.

Później Szyfr Cezara był stosowany między innymi w XIX wieku w Stanach Zjednoczonych. Korzystali z niego ukrywający swoją miłość kochankowie, którzy umieszczali zaszyfrowane w ten sposób teksty w ogłoszeniach drobnych w gazecie. Z kolei w XX wieku w armii rosyjskiej z Szyfru Cezara korzystali prości żołnierze, dla których bardziej skomplikowane metody kodowania były zbyt trudne do opanowania.

Jak zastosować Szyfr Cezara – przykład

Stosowanie Szyfru Cezara jest dość proste. Wystarczy wybrać liczbę, o którą chcesz przesunąć litery w alfabecie i zastosować ten sam klucz podczas zarówno szyfrowania, jak i deszyfrowania. Na przykład, jeśli wybierzesz przesunięcie o 3 pozycje, to do zaszyfrowania tekstu “HELLO” użyje się klucza 3, a otrzymane hasło będzie brzmiało “KHOOR”. W ramach tego artykułu korzystam z alfabetu łacińskiego, złożonego z 26 liter (bez polskich znaków), zamiast z polskiego, który ma 32 znaki. Natomiast jeśli w tekście znajdują się liczby, to pozostawia się je bez zmian.

Szyfr Cezara - przykład gif
Każda litera w tekście jest zamieniana na literę znajdującą się o określoną liczbę pozycji dalej w alfabecie.

Stosowanie Szyfru Cezara w praktyce okazuje się naprawdę proste. Poniżej zastosowano szyfrowanie oraz deszyfrowanie słowa “informacja” dla przestawienia równego 2, krok po kroku, przy zastosowaniu widocznego alfabetu łacińskiego.

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

Pierwsza litera w słowie “informacja” to “i”, dwie litery w alfabecie w prawo dalej to “k”. Zatem:

i ⮕ k

Następnie zmienia się “N” na “P”:

n ⮕ p

Potem następują kolejne przestawienia:

f ⮕ h

o ⮕ q

r ⮕ t

m ⮕ o

a ⮕ c

c ⮕ e

j ⮕ l

a ⮕ c

Co w rezultacie tworzy tekst: kphqtocelc.

Deszyfrowanie szyfru Cezara wygląda prawie tak samo, z tym wyjątkiem, że należy stosować przestawienie w lewą stronę o 2.

k ⮕ i

p ⮕ n

h ⮕ f

q ⮕ o

t ⮕ r

o ⮕ m

c ⮕ a

e ⮕ c

l ⮕ j

c ⮕ a

Co w rezultacie pozwala odczytać tekst: informacja.

Wielokrotne szyfrowanie cezarem, czyli zastosowanie Szyfru Cezara więcej niż raz na tym samym tekście, nie jest skuteczną metodą zwiększenia bezpieczeństwa. Powód jest dość prosty – Szyfr Cezara jest szyfrem podstawieniowym, a każde kolejne zaszyfrowanie jest jedynie kolejnym przesunięciem liter. Gdy użyje się klucza 2 do zaszyfrowania tekstu “informacja”, wyjdzie “kphqtocelc”, natomiast jeśli ponownie zastosuje się klucz 2 do zmienionego tekstu, otrzymany zostanie “mrjsvqegne”.

W efekcie powstanie tekst, który jest zaszyfrowaniem tekstu jawnego kluczem 4 zamiast 2. Widać to przykładowo przy zmianie pierwszej litery z kluczem 4: “I” zmienia się na “M”, co możesz sprawdzić przy pomocy alfabetu udostępnionego wcześniej.

Jak widać, wielokrotne szyfrowanie cezarem nie wprowadza żadnej dodatkowej złożoności, ponieważ kolejne przesunięcia liter są liniowe i przewidywalne.

ads banner
Szyfr Cezara w informatyce – kody ASCII

Szyfr Cezara ma swoje korzenie w matematyce, a dokładniej w operacjach modulo. Modulo pozwala uzyskać resztę z dzielenia liczby przez inną liczbę. W przypadku Szyfru Cezara jest ona wykorzystywana do przesuwania liter w alfabecie.

Pierwszy przykład Szyfru Cezara w połączeniu z ASCII

Litera “B” ma kod ASCII 66. Chcę ją przesunąć o 3 miejsca w prawo.

Obliczenie pozycji litery: 66 – 65 = 1.

Dodanie 3 do pozycji litery: 1 + 3 = 4.

Obliczenie reszty z dzielenia 4 modulo 26 (liczba liter w alfabecie): 4 % 26 = 4.

Dodanie reszty do kodu “A”: 65 + 4 = 69.

Kod ASCII 69 odpowiada literze “E”, więc otrzymuję zaszyfrowaną literę “E”.

Ten proces jest powtarzany dla każdej litery w tekście, co prowadzi do powstania zaszyfrowanego tekstu.

Powyższy przykład jest jednak dość oczywisty i nie obrazuje, jak istotna jest operacja modulo w szyfrze. Dlatego przedstawię drugi przykład, mający na celu zaszyfrowanie litery “Y”, której kod ASCII wynosi 89 i którą chcę przesunąć o 8 miejsc w prawo. Po literze “Y” w alfabecie występuje jedynie litera “Z”, a więc niezbędne będzie zapętlenie alfabetu. I to właśnie do tego wykorzystywana jest operacja modulo.

Drugi przykład Szyfru Cezara w połączeniu z ASCII

Obliczenie pozycji litery: 89 – 65 (kod “A”) = 24.

Dodanie pozycji do klucza: 24 + 8 = 32.

Obliczenie reszty z dzielenia 32 modulo 26 (liczba liter w alfabecie): 32 % 26 = 6.

Dodanie reszty do kodu “A”: 65 + 6 = 71.

Kod ASCII 71 odpowiada literze “G”, więc zaszyfrowaną literą dla “Y” jest “G”.

W tym przypadku zaszyfrowana litera to “G”. Ten proces jest powtarzany dla każdej litery w tekście, co tworzy zaszyfrowany tekst.

Kryptoanaliza – odszyfrowanie Szyfru Cezara

Gdy zależy Ci na możliwości odszyfrowania tego rodzaju kodowania, możesz skorzystać z pewnej techniki kryptoanalizy. Gdy wiesz, że zastosowano jakiś rodzaj szyfru podstawieniowego, możliwe jest wykorzystanie analizy częstościowej, czyli ataku statystycznego.

Wykres częstości występowania liter w języku polskim
Częstość występowania liter w języku polskim można wykorzystać w procesie deszyfrowania tekstu, np. przy użyciu analizy częstotliwości liter w szyfrogramie do zgadywania klucza lub metody szyfrowania.

Na powyższym wykresie widać, że w słowach różnego typu konkretne litery nie występują równie często. W polskim alfabecie najczęściej pojawia się litera A. Można więc przeprowadzić podobną analizę na zaszyfrowanym tekście, dzięki czemu będzie wiadomo, jak często występują w nim konkretne litery. Następnie należy sprawdzić jego podobieństwo do wykresu dotyczącego polskiego alfabetu i zorientować się, które kolumny wykresu sobie odpowiadają. Przykładowo: jeśli kolumna posiadająca około 8,91% to E, można się zorientować, że szyfr najpewniej korzysta z przestawienia o 6 znaków. Oczywiście, konieczne jest porównanie ze sobą różnych kolumn dla uzyskania pewności, bo zależnie od długości tekstu liczba procentowa może odrobinę się różnić.

Drugą metodą, którą można zastosować – jeśli masz pewność, że zastosowano Szyfr Cezara – jest atak brute force. By go zastosować, wystarczy przestawić zakodowany tekst na wszystkie możliwe sposoby. W przypadku alfabetu łacińskiego jest to 25 możliwości, a w przypadku polskiego – 31. Możesz skorzystać z translatora umieszczonego na początku artykułu do deszyfracji danego tekstu w zakresie od 1 do 25 lub 31.

Obecne zastosowanie Szyfru Cezara – ciekawostka dla ambitnych

Ze względu na swoją prostotę Szyfr Cezara jest obecnie niezwykle często wykorzystywany w ramach nauki – jest np. dobrym punktem wyjścia do nauki kryptografii i kryptoanalizy. Warto jednak zauważyć, że istnieją pokrewne rodzaje kodowania, które nadal są wykorzystywane w celu zabezpieczania informacji. Chodzi między innymi o szyfr Vigenère’a czy ogólnie szyfry z kluczem jednorazowym.

Przedstawię tu zasadę uproszczonej wersji szyfru z kluczem jednorazowym. Jego zastosowanie polega na przesuwaniu każdej litery z tekstu o inną liczbę liter, która znajduje się w kluczu. Pod spodem umieszczę przykład takiego przestawienia wykorzystującego alfabet łaciński, co pomoże wyjaśnić zasadę działania.

T E K S T

K L U C Z

Literę “T” przesuwa się o 10 liter w prawo na “D”, bo “K” ze słowa “klucz” jest w alfabecie na 10. miejscu (przy założeniu, że A to 0).

T ⮕ D

Literę “E” przesuwa się o 11 liter w prawo na “P”, bo “L” ze słowa “klucz” jest w alfabecie na 11. miejscu. Następnie wykonuje się te same operacje z kolejnymi literami.

E ⮕ P

K ⮕ E

S ⮕ U

T ⮕ S

W rezultacie tworzy to zaszyfrowany tekst DPEUS. W celu jego odszyfrowania należy zastosować klucz w drugą stronę, a więc przestawiać litery w lewo.

Gdyby tekst do szyfrowania był dłuższy niż klucz, to należy powtarzać klucz tak wiele razy, ile jest to konieczne dla osiągnięcia tej samej liczby liter. Przykładowo przy tekście “informacja” i kluczu “klucz” stosuje się klucz “kluczklucz”, bo tekst posiada 10 znaków. Jeśli klucz jest tej samej długości lub dłuższy niż tekst, stosowany jest tylko raz, a przy tym składa się z losowego ciągu znaków (dla większego bezpieczeństwa zaleca się nie używanie generatora liczb pseudolosowych), jest praktycznie nie do złamania.

Algorytm Szyfr Cezara – pseudokod, schemat blokowy oraz implementacje

W poniższym pseudokodzie, schemacie blokowym oraz implementacjach stosowany jest alfabet łaciński, a sam szyfr przekształcany jest przy pomocy tablicy kodów ASCII.

Szyfr Cezara: szyfrowanie – pseudokod i schemat blokowy

Szyfr Cezara - Schemat blokowy
Szyfr Cezara jest dobry do nauki podstaw kryptografii i historycznie ważny, ale nie nadaje się do ochrony współczesnych informacji.

W pseudokodzie rozpoczyna się indeksację liter w napisie od 1, czyli dokładnie tak jak powinna być stosowana indeksacja na maturze z informatyki. W schemacie blokowym i pseudokodzie zostały wykorzystane zmienne typu string (napis) i funkcja kod_ASCII(), które nie są dostępne na maturze.

Opis Szyfru Cezara – pseudokod

  • 1. linia – definiuje funkcję szyfrCezara z dwoma argumentami: “tekst” (ciąg znaków do zaszyfrowania) i “klucz” (liczba określająca przesunięcie w alfabecie),
  • 2. linia – inicjalizuje pusty ciąg znaków “wynik”, który będzie zawierał zaszyfrowany tekst,
  • 3. linia – przypisuje do zmiennej “n” długość tekstu, czyli liczbę znaków w ciągu “tekst”,
  • 4. linia – rozpoczyna pętlę for, która iteruje od 1 do “n”, czyli po indeksach każdego znaku w zmiennej “tekst”,
  • 5. linia – przypisuje do zmiennej “znak” kod ASCII znaku na pozycji “i” w zmiennej “tekst” (ze względu na wymogi CKE indeksowanie zaczyna się od 1 do “n”). Funkcja kod_ASCII służy do zamiany konkretnego znaku (w przypadku powyższego pseudokodu litery) na kod ASCII,
  • 6. linia – sprawdza, czy “znak” jest literą poprzez kod ASCII. Pierwszy warunek (znak ≥ kod_ASCII(“a”) i znak ≤ kod_ASCII(“z”)) sprawdza małe litery (a-z), a drugi warunek (znak ≥ kod_ASCII(“A”) i znak ≤ kod_ASCII(“Z”)) sprawdza wielkie litery (A-Z),
  • 7. linia – sprawdza, czy “znak” jest małą literą (a-z),
  • 8. linia – jeśli “znak” jest małą literą, to zmienna “baza” równa się 97, co odpowiada kodowi ASCII dla “a”,
  • 9. linia – jeśli znak nie jest małą literą, to musi być wielką literą (A-Z),
  • 10. linia – ustawia zmienną “baza” na 65, co odpowiada kodowi ASCII dla “A”,
  • 11. linia – oblicza przesunięcie dla znaku. Formuła (znak – baza + klucz) mod 26 pozwala obliczyć, o ile przesunąć należy kod ASCII, natomiast dzielenie modulo 26 pozwala zapobiec wyjściu poza zakres liter. Przykładowo (120 – 97 + 7) mod 26 = 30 mod 26 = 4. Gdyby zabrakło dzielenia modulo, przestawiono by kod ASCII o 30 w prawo, czyli na numer 137, a więc daleko poza zakres liter. Natomiast modulo pozwala określić, że wystarczy przesunąć kod o liczbę 4,
  • 12. linia – przesuwa kod ASCII o obliczoną wcześniej wartość poprzez dodanie ze sobą bazy (pierwszej małej lub dużej litery w kodzie ASCII) oraz obliczoną wartość przesunięcia. Następnie zmienia je na znak poprzez funkcję znak_ASCII (służy do użycia wartości liczbowej jako kodu ASCII i zwrócenia odpowiedniego znaku),
  • 13. linia – dodaje “nowyZnak” do ciągu “wynik”,
  • 14. linia – warunek sprawdzający, czy “znak” nie jest literą (nie mieści się w zakresach a-z lub A-Z),
  • 15. linia – dodaje niezmieniony “znak” do “wynik”, bo znak nie jest literą, a więc nie wykona się na nim przestawienia,
  • 16. linia – zwraca zaszyfrowany tekst “wynik”.

Różnica między algorytmem odszyfrowywania, a algorytmem szyfrowania polega na zmianie pozycji litery. W przypadku algorytmu szyfrowania dodaje się klucz do pozycji litery, natomiast w przypadku algorytmu odszyfrowywania odejmuje się klucz od pozycji litery. Dlatego chcąc zdeszyfrować tekst, wystarczy podać klucz na minusie, czyli przykładowo zamiast 5 podaje się -5.

Szyfr Cezara – Python, C++ i Java

Szyfr Cezara – Python

Szyfr Cezara – C++

Szyfr Cezara – Java

Ważnym aspektem operatora modulo w różnych językach programowania jest to jak traktuje liczby ujemne, a raczej jaki znak (dodatni lub ujemny) będzie posiadać wynik w przypadku gdy zastosuje się liczby ujemne. Pod spodem znajdziesz informacje na temat języków python, C++ i java.

W pythonie reszta z dzielenia:

  • W pythonie reszta z dzielenia zawsze ma taki sam znak jak dzielnik (liczba, przez którą dzielisz). Oznacza to, że niezależnie od tego, czy liczby są dodatnie czy ujemne, reszta zawsze będzie miała znak zgodny z dzielnikiem. Czyli np. LiczbaDodatnia % LiczbaUjemna = LiczbaUjemna, a LiczbaUjemna % LiczbaDodatnia = LiczbaDodatnia. To jest istotna różnica w porównaniu do C++ i javy.

W C++ i Java reszta z dzielenia:

  • Jeśli obie liczby są dodatnie, wynik będzie dodatni.
  • Jeśli dzielna (liczba którą dzielimy) jest ujemna, wynik będzie również ujemny. Np. LiczbaUjemna % LiczbaDodatnia = LiczbaUjemna.
  • Jeśli dzielnik jest ujemny, a dzielna dodatnia, wynik będzie dodatni. Np. LiczbaDodatnia % LiczbaUjemna = LiczbaDodatnia.

QUIZ – Sprawdź swoją wiedzę

Najczęściej zadawane pytania o Szyfr Cezara

Ile jest kluczy w Szyfrze Cezara?

W Szyfrze Cezara istnieje 25 możliwych kluczy (alfabet łaciński), ponieważ możemy przesunąć litery alfabetu o dowolną liczbę miejsc, z wyjątkiem 0 (brak przesunięcia) i 26 (powrót do początku alfabetu). Klucz może być więc wybrany spośród liczb całkowitych od 1 do 25.

Możliwe jest również podanie klucza większego, np. 28, jednak wtedy zmienia się tę liczbę za pomocą modulo. Wygląda to więc następująco: 28 modulo 26 = 2, co w rezultacie tworzy klucz o wartości 2.

W przypadku polskiego alfabetu istnieje 31 kluczy, poza tym – tak jak w przypadku łacińskiego – istnieją wyjątki, czyli 0 (brak przesunięcia) oraz 32 (powrót do początku alfabetu). Jest tu większa liczba kluczy ze względu na polskie znaki, np. “ą”. Klucze większe od 32 również są modyfikowane poprzez operację modulo.

Czy Szyfr Cezara jest symetryczny?

Szyfr Cezara jest symetryczny, to znaczy ten sam klucz używany jest zarówno do szyfrowania, jak i do deszyfrowania wiadomości. Jeśli więc użyjesz wybranego klucza do zaszyfrowania wiadomości, możesz go użyć również do odszyfrowania jej.

Czym się różni kod od szyfru?

Kod różni się od szyfru głównie tym, że kodowanie danych ma na celu przekształcenie ich z jednej formy na inną zgodnie z pewnymi regułami, zwykle w sposób trwały i nieodwracalny, jednak możliwy do zrozumienia. Może też chodzić o wiadomość posiadającą ukryte znaczenie, niewidoczne na pierwszy rzut oka. Natomiast szyfrowanie jest procesem, który ma na celu zabezpieczenie danych przed nieautoryzowanym dostępem osób niepowołanych poprzez ich przekształcenie w formę niezrozumiałą bez znajomości klucza deszyfrującego. W skrócie, kodowanie jest ogólnym procesem przekształcania danych, podczas gdy szyfrowanie jest specyficznym rodzajem kodowania używanym do zabezpieczania informacji.

ads banner