R1C3iiryoy8vQ
Zdjęcie przedstawia posąg Juliusza Cezara w parku Tuileries w Paryżu. Cezar ma poważny wyraz twarzy. Jego głowę zdobi wieniec z liści laurowych. W lewej dłoni wyciągniętej nieco przed siebie trzyma zwój papirusu. Na ramionach i na pasie ma narzuconą tkaninę. W tle posągu rosną drzewa.

PY_I_P_W14_M14 Ukryj wiadomość - szyfrowanie tekstów metodą Cezara.

Źródło: Pixabay, domena publiczna.

Imprerium Rzymskie, I w. p.n.e. Państwem włada Juliusz Cezar.Juliusz CezarJuliusz Cezar. Przypuszcza się, że do komunikowania się ze swoimi przyjaciółmi używał szyfru, który później zyskał miano szyfru Cezara. W jaki sposób szyfrowano informacje w starożytności?

Szyfr przesuwający

Pod pojęciem „szyfr Cezara” kryje się szyfr przesuwający. To niezwykle prosta technika, będąca szczególnym przypadkiem szyfru podstawieniowegoszyfr podstawieniowyszyfru podstawieniowego, w której każdy znak szyfrowanej wiadomości jest zastępowany innym, oddalonym od niego w alfabecie o określoną odległość. W przypadku tego algorytmu ignoruje się wielkość liter.

Na czym polega szyfr Cezara?

Szyfr Cezara jest szyfrem podstawieniowym, służącym do utajniania tekstów. Oznacza to, że każda litera w szyfrowanym ciągu znaków zastępowana jest inną, oddaloną w alfabecie o pewną stałą liczbę miejsc. Odległość, o którą oddalone są litery zastępowana i zastępująca, nazywa się kluczem szyfru.

Posłużmy się przykładem. Przyjmijmy, że używając klucza równego 4 chcemy zaszyfrować literę „a”. Musimy ją więc zastąpić literą położoną o 4 miejsca dalej w alfabecie:

R5QIyoN50rFJm
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Po zaszyfrowaniu litera „a” stanie się literą „e”. Tekst zapisany w taki sposób jest w stanie odkodować tylko osoba znająca metodę szyfrowania i rozmiar klucza.

Ponieważ alfabet łaciński składa się z 26 liter, a zastosowanie klucza równego zero nie powoduje zastąpienia jednych znaków innymi, możemy zakodować tekst tylko na 25 sposobów. W rezultacie szyfr Cezara jest dość łatwy do złamania, nawet gdy nie znamy użytego klucza.

Spróbujmy teraz zaszyfrować literę „z”, używając klucza 5. Ponieważ „z” jest ostatnią literą alfabetu, nie możemy jej zastąpić inną, położoną o choćby jedno miejsce dalej. W takiej sytuacji zaczynamy odliczanie od początku alfabetu:

R1aiKwmIuzMnR
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Litera „z” po zaszyfrowaniu zamieni się zatem w literę „e”.

Jak już wspominaliśmy, klucz może przybrać tylko 25 wartości, aby jedne litery w tekście zostały zastąpione innymi. Wynika to z liczby znaków alfabetu łacińskiego. Dlaczego jednak nie zastosować klucza o wartości większej niż 25?

Otóż jeżeli użyjemy klucza o wartości 27, tekst wciąż będzie szyfrowany, ale osiągniemy taki sam wynik jak w przypadku zastosowania klucza o wartości 1. Klucz równy 28 odpowiada kluczowi wynoszącemu 2 itd. W rezultacie mamy do dyspozycji tylko 25 kluczy.

Przykład I

Spróbujmy zaszyfrować słowo „ser”, używając klucza równego 3. Zaczniemy od pierwszej litery, czyli „s”:

R1QGEY6E9r4P5
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Litera „s” zostanie zastąpiona przez „v”. Następna jest litera „e”:

R13qEE6wiKU1G
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

W tym przypadku nowym znakiem jest „h”. Pozostało nam jeszcze zaszyfrować literę „r”:

R1GnTbmlKmJEY
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Ostatecznie słowo „ser”, zakodowane za pomocą szyfru Cezara o kluczu równym 3, zmienia się w wyraz „vhu”. Jeżeli każdy jego znak zastąpimy literą o trzy pozycje wcześniejszą (czyli przesuniemy je „w lewo” o wartość klucza), odszyfrujemy ciąg, otrzymując ponownie słowo „ser”.

Przykład II

Posłużymy się jeszcze jednym przykładem, aby sprawdzić, jak działa taka technika. Załóżmy, że chcemy zorganizować niespodziewane przyjęcie urodzinowe dla naszego kolegi. Musimy wysłać wiadomość do jego znajomych, kiedy wyjdzie z domu, ale nie chcemy, by przypadkiem ją odczytał. Umówiliśmy się, że zakodujemy wiadomość jak Juliusz Cezar, który stosował przesunięcie o trzy pozycje do przodu. W przypadku tego algorytmu jest to klucz szyfru.

Przygotujemy sobie wiadomość do zaszyfrowania, czyli tekst jawny:

Linia 1. Tekst jawny dwukropek MIESZKANIE OTWARTE WRACAMY ZA GODZINĘ.

Polski alfabet liczy 32 litery, zatem przesuwając cały alfabet o trzy pozycje, otrzymamy następujący szyfr:

Linia 1. Alfabet dwukropek AĄBC ĆDEĘ FGHI JKLŁ MNŃO ÓPRS ŚTUW YZŹŻ. Linia 2. Szyfr dwukropek CĆDE ĘFGH IJKL ŁMNŃ OÓPR SŚTU WYZŹ ŻAĄB.

Podmieniając każdą literę tekstu jawnego jej zaszyfrowanym odpowiednikiem, otrzymamy następujący wynik, czyli tekst zaszyfrowany:

Linia 1. Tekst jawny dwukropek. Linia 2. MIESZKANIE OTWARTE WRACAMY ZA GODZINĘ. Linia 4. Tekst zaszyfrowany dwukropek. Linia 5. OLGUAMCÓLG RYŹCTYG ŹTCECOŻ AC JRFALÓH.

Tak zaszyfrowany tekst wygląda jak przypadkowa wiadomość, ale może zawierać istotne informacje – w tym wypadku czas, jaki pozostał do powrotu kolegi do domu. Niestety, ze względu na swoją prostotę szyfr Cezara znajduje zastosowanie jedynie tam, gdzie nie zależy nam na gwarancji bezpieczeństwa komunikacji. Czasem bywa również fragmentem bardziej złożonych algorytmów szyfrujących.

Odszyfrowanie wiadomości to operacja odwrotna do wykonanej na początku. Zatem jeśli wiadomość zaszyfrowano, przesuwając alfabet o trzy pozycje do przodu, to rozszyfrowanie sprowadza się do przesunięcia go o trzy pozycje do tyłu.

KryptoanalizakryptoanalizaKryptoanaliza

Istnieją dwie techniki łamania szyfru Cezara, zależne od tego, czy jesteśmy pewni, że to właśnie on został użyty. Przyjrzyjmy się najpierw przypadkowi, w którym wiemy, że użyto szyfru Cezara.

Liczbę możliwych przesunięć możemy wyrazić wzorem:

L=n1

gdzie n jest liczbą znaków w alfabecie; w przypadku języka polskiego mamy do dyspozycji 32 litery.

W przypadku alfabetu łacińskiego mowa już tylko o 26 znakach. Jedno przesunięcie możemy pominąć, ponieważ wiadomość znajduje się już w stanie początkowym. Oczywiście moglibyśmy użyć znacznie bardziej skomplikowanego alfabetu i utrudniłoby to ręczne odszyfrowanie wiadomości. Programistycznie jednak przypadek ten sprowadza się do metody siłowej, gdzie w prosty sposób jesteśmy w stanie uzyskać wszystkie możliwe przesunięcia, a wśród nich będzie również to prawidłowe. Podchodząc do problemu matematycznie, moglibyśmy przyjąć, że każda litera alfabetu oznaczona jest liczbą, na przykład A→0, Ą→1, B→2. Szyfrowanie moglibyśmy zatem zapisać w postaci następującego równania:

Si=(xi+t)modn

gdzie:
SIndeks dolny i – numer litery po zaszyfrowaniu,
xIndeks dolny i – przyporządkowany numer litery,
t – przesunięcie,
mod – operator reszty z dzielenia (modulo),
n – liczba znaków w alfabecie.

Używając tego równania, moglibyśmy skonstruować następujący pseudokod:

Linia 1. dla t znak równości 0 przecinek 1 przecinek 2 kropka kropka kropka n minus 1 wykonuj dwukropek. Linia 2. przesuń każdy znak o t pozycji.

A co zrobić, jeśli słowo było wielokrotnie szyfrowane? Przesunięcia się sumują, zatem przesunięcie o 10 do przodu, 3 do tyłu i 5 do przodu w rzeczywistości sprowadza się do jednego przesunięcia o 12 do przodu. Jedynym przypadkiem, w którym rozszyfrowanie może nie być skuteczne, są bardzo krótkie wiadomości. Dla nich może istnieć więcej niż jedno rozwiązanie.

Drugą techniką łamania szyfru jest sytuacja, w której nie mamy pewności, czy użyto szyfru Cezara. Stosuje się wtedy te same metody, co w przypadku innych szyfrów podstawieniowych, np. wykorzystuje się statystykę. Litery w różnych językach pojawiają się z pewnym prawdopodobieństwem. W języku polskim najczęściej występują litery A, I, O oraz E. Zatem w zaszyfrowanej wiadomości można czasem odnaleźć pewną zależność i wywnioskować, że użyto właśnie szyfru Cezara.

Szyfr Cezara – pseudokod

Skoro wiemy już jak działa szyfr Cezara, spróbujmy zapisać jego algorytm w pseudokodzie, który później przełożymy na język Python. Zaczniemy od zdefiniowania kilku zmiennych:

Linia 1. wyraz znak równości cudzysłów informatyka cudzysłów. Linia 2. zaszyfrowanyWyraz znak równości cudzysłów cudzysłów. Linia 3. klucz znak równości 4.

Następną czynnością jest odczytanie poszczególnych liter szyfrowanego wyrazu (musimy bowiem zakodować każdy znak osobno):

Linia 1. wyraz znak równości cudzysłów informatyka cudzysłów. Linia 2. zaszyfrowanyWyraz znak równości cudzysłów cudzysłów. Linia 3. klucz znak równości 4. Linia 5. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły wyraz zamknij nawias okrągły wykonuj.

W jaki sposób zastąpimy („przesuniemy w prawo”) litery składające się na wyraz? Przypomnijmy sobie, czym jest kodkod ASCIIkodASCIIkod ASCIIASCII. Każdy zapisany w tym systemie znak ma przyporządkowany odpowiednik liczbowy. Litery są uporządkowane alfabetycznie („a” ma przypisaną wartość 97, zaś „z” – 122). Wystarczy zatem dodać wartość klucza do liczby odpowiadającej literze w kodzie ASCII. Otrzymamy nowy kod, który odpowiada zaszyfrowanej literze.

Niestety, napotkamy wówczas pewien problem. Co się stanie, gdy – przykładowo –  będziemy chcieli przesunąć literę „z” o 3 miejsca dalej?

Liczbowy zapis „z” w kodzie ASCII to 122. Po dodaniu do niego liczby 3, nie otrzymamy litery „c” – jej wartość w kodzie ASCII wynosi 99. Zamiast tego uzyskamy symbol } (prawy nawias klamrowy) – właśnie jemu w kodzie ASCII odpowiada liczba 125.

Aby rozwiązać taki problem, musimy najpierw odjąć od sumy (wynoszącej w opisywanym przypadku 125) wartość litery „a” w kodzie ASCII. Następnie obliczamy resztę z dzielenia otrzymanej różnicy przez 26. Na koniec do wyniku dodajemy ponownie wartość litery „a” w kodzie ASCII.

W rezultacie po otrzymaniu kodu ASCII spoza zakresu odpowiadającego literom łacińskim, znak zostanie przeniesiony na początek alfabetu:

Linia 1. wyraz znak równości cudzysłów informatyka cudzysłów. Linia 2. zaszyfrowanyWyraz znak równości cudzysłów cudzysłów. Linia 3. klucz znak równości 4. Linia 5. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły wyraz zamknij nawias okrągły wykonuj. Linia 6. przesunietaLitera znak równości wartośćASCII otwórz nawias okrągły wyraz otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły plus klucz. Linia 7. poprawkaNaKoniecAlfabetu znak równości otwórz nawias okrągły przesunietaLitera minus wartośćASCII otwórz nawias okrągły apostrof a apostrof zamknij nawias okrągły zamknij nawias okrągły procent 26. Linia 8. zaszyfrowanaLitera znak równości znakZASCII otwórz nawias okrągły poprawkaNaKoniecAlfabetu plus wartośćASCII otwórz nawias okrągły apostrof a apostrof zamknij nawias okrągły zamknij nawias okrągły.

W omówionym pseudokodzie pojawiają się dwie funkcje: wartośćASCII()znakZASCII(). Pierwsza z nich zwraca wartość kodu ASCII podanego znaku. Druga zwraca znak o podanym kodzie ASCII.

Pozostaje jeszcze zastosować konkatenację w celu dopisania zaszyfrowanej litery do wyrazu:

Linia 1. wyraz znak równości cudzysłów informatyka cudzysłów. Linia 2. zaszyfrowanyWyraz znak równości cudzysłów cudzysłów. Linia 3. klucz znak równości 4. Linia 5. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły wyraz zamknij nawias okrągły wykonuj. Linia 6. przesunietaLitera znak równości wartośćASCII otwórz nawias okrągły wyraz otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły plus klucz. Linia 7. poprawkaNaKoniecAlfabetu znak równości otwórz nawias okrągły przesunietaLitera minus wartośćASCII otwórz nawias okrągły apostrof a apostrof zamknij nawias okrągły zamknij nawias okrągły procent 26. Linia 8. zaszyfrowanaLitera znak równości znakZASCII otwórz nawias okrągły poprawkaNaKoniecAlfabetu plus wartośćASCII otwórz nawias okrągły apostrof a apostrof zamknij nawias okrągły zamknij nawias okrągły. Linia 9. zaszyfrowanyWyraz znak równości zaszyfrowanyWyraz plus zaszyfrowanaLitera.

W kolejnej sekcji przełożymy pseudokod na instrukcje w języku Python.

Słownik

Juliusz Cezar
Juliusz Cezar

(100 p.n.e. – 44 p.n.e.), rzymski polityk, wódz, dyktator i pisarz

szyfr podstawieniowy
szyfr podstawieniowy

szyfr, w którym każdy znak tekstu jawnego zastępowany jest innym znakiem szyfrogramu

kod ASCII
kod ASCII

 7‑bitowy system kodowania znaków, w którym każdy z obsługiwanych symboli jest reprezentowany przez liczbę; 7 bitów umożliwia przechowanie informacji o znakach o kodach z zakresu 0‑127; używany m.in. we współczesnych komputerach oraz sieciach komputerowych

konkatenacja
konkatenacja

łączenie ze sobą łańcuchów znaków

kryptoanaliza
kryptoanaliza

analiza systemu kryptograficznego w celu wyciągnięcia informacji przez niego utajnionych

kryptografia
kryptografia

nauka zajmująca się szyfrowaniem, czyli zamianą treści jawnej i dostępnej publicznie, na treść tajną, która może zostać odczytana tylko przez upoważnione jednostki

szyfr Cezara
szyfr Cezara

metoda utajniania tekstu, polegająca na zmianie liter z tekstu na litery położone w alfabecie określoną liczbę miejsc dalej

Juliusz Cezar
szyfr podstawieniowy