.::Szyfr Cezara::.
Szyfr Cezara (zwany też szyfrem przesuwającym, kodem Cezara lub przesunięciem Cezariańskim) – w kryptografii jedna z najprostszych technik szyfrowania. Jest to rodzaj szyfru podstawieniowego, w którym każda litera tekstu jawnego (niezaszyfrowanego) zastępowana jest inną, oddaloną od niej o stałą liczbę pozycji w alfabecie, literą (szyfr monoalfabetyczny), przy czym kierunek zamiany musi być zachowany. Nie rozróżnia się przy tym liter dużych i małych. Nazwa szyfru pochodzi od Juliusza Cezara, który prawdopodobnie używał tej techniki do komunikacji ze swymi przyjaciółmi.
Szyfr Cezara zastępuje każdą literę tekstu jawnego inną, przesuniętą względem litery kodowanej o stałą liczbę pozycji w alfabecie. Na rysunku szyfr z przesunięciem równym 3, tak więc B w tekście jawnym jest podmieniane w szyfrogramie na E (rozpatrywany jest alfabet łaciński).
Przykład:
Zaszyfrować zdanie: NIEPRZYJACIEL JEST BARDZO BLISKO.
Poszczególne literki tekstu jawnego zastępujemy literkami szyfru Cezara zgodnie z powyższą tabelką kodu. Spacje oraz inne znaki nie będące literami pozostawiamy bez zmian:
NIEPRZYJACIEL JEST BARDZO BLISKO
QLHSUCBMDFLHO MHVW EDUGCR EOLVNR
Deszyfrowanie tekstu zaszyfrowanego kodem Cezara polega na wykonywaniu operacji odwrotnych. Każdą literę kodu zamieniamy na literę leżącą o trzy pozycje wcześniej w alfabecie.
Szyfr Cezara | 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 |
Tekst jawny | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W |
Podobnie jak poprzednio trzy pierwsze znaki szyfru Cezara nie posiadają bezpośrednich odpowiedników liter leżących o trzy pozycje wcześniej, ponieważ alfabet rozpoczyna się dopiera od pozycji literki D. Rozwiązaniem jest ponowne "zawinięcie" alfabetu tak, aby przed literą A znalazły się trzy ostatnie literki X, Y i Z.
Do wyznaczania kodu literek przy szyfrowaniu i deszyfrowaniu posłużymy się operacjami modulo. Operacja modulo jest resztą z dzielenia danej liczby przez moduł. Wynik jest zawsze mniejszy od modułu. U nas moduł będzie równy 26, ponieważ tyle mamy liter alfabetu.
Ujęcie matematyczne:
Operację szyfrowania i deszyfrowania można wyrazić w języku arytmetyki modularnej. W tym celu wystarczy każdej literze alfabetu jednoznacznie przypisać jej numer według schematu A↔0, Ą↔1, B↔2, …, Ż↔31. Wygodnie jest też przyjąć, że klucz jest pewną liczbą z zakresu 0...31 (jest to numer zaszyfrowanej litery A).
Szyfrowanie można wtedy zdefiniować za pomocą kongruencji:
,
gdzie jest numerem litery tekstu jawnego w alfabecie,
– numerem litery szyfrogramu w alfabecie.
Podobnie deszyfrowanie tekstu można zapisać jako:
gdzie jest numerem litery szyfrogramu w alfabecie,
– numerem litery tekstu jawnego w alfabecie.
Na podstawie własności kongruencji i tego, że ,
są z przedziału 0...31:
- jeśli przy wyznaczaniu
wartość wyrażenia
przekroczy 32 – 1, to należy ją zmniejszyć o 32.
- jeśli przy wyznaczaniu
wartość wyrażenia
będzie ujemna, to należy ją zwiększyć o 32.
Operacje ,
są do siebie odwrotne, bowiem przesuwanie w prawo o
jest zarazem przesuwaniem w lewo o
.
Algorytm szyfrowania tekstu kodem Cezara:
Wejście
Łańcuch tekstowy s
Wyjście:
Łańcuch tekstowy s zaszyfrowany kodem Cezara
Elementy pomocnicze:
i | – | indeks, i ![]() |
kod(x) | – | zwraca kod litery x |
znak(x) | – | zamienia kod x na odpowiadający mu znak ASCII |
Lista kroków:
K01: | Dla i = 0,1,...,|s| - 1 wykonuj K02...K03 | ; przeglądamy kolejne znaki tekstu |
K02: | Jeśli s[i] < "A" ∨ s[i] > "Z", to następny obieg pętli K01 | ; pomijamy znaki nie będące literami A...Z |
K03: | s[i] ← znak(65 + (kod(s[i]) - 62) mod 26) | ; szyfrujemy szyfrem Cezara |
K04: | Pisz s | |
K05: | Zakończ Przykład kodu w C++: #include <iostream> #include <string> using namespace std; int main() { string s; int i; // odczytujemy wiersz znaków getline(cin,s); // zamieniamy małe litery na duże // i kodujemy szyfrem cezara for(i = 0; i < s.length(); i++) { s[i] = toupper(s[i]); if((s[i] >= 'A') && (s[i] <= 'Z')) s[i] = char(65 + (s[i] - 62) % 26); } // wypisujemy zaszyfrowany tekst cout << s << endl << endl; return 0; |
Wejście:
Łańcuch tekstowy s zaszyfrowany kodem Cezara
Wyjście:
Tekst jawny
Elementy pomocnicze:
i | – | indeks, i ![]() |
kod(x) | – | zwraca kod litery x |
znak(x) | – | zamienia kod x na odpowiadający mu znak ASCII |
Lista kroków:
K01: | Dla i = 0,1,...,|s| - 1 wykonuj K02...K03 | ;przetwarzamy kolejne znaki tekstu |
K02: | Jeśli s[i] < "A" ∨ s[i] > "Z", to następny obieg pętli K01 | ; pomijamy znaki nie będące literami A...Z |
K03: | s[i] ← znak(65 + (kod(s[i] - 42) mod 26) | ; deszyfrujemy |
K04: | Pisz s | |
K05: | Zakończ Przykład kodu w C++: #include <iostream> #include <string> using namespace std; int main() { string s; int i; // odczytujemy wiersz znaków getline(cin,s); // zamieniamy małe litery na duże // i rozszyfrowujemy for(i = 0; i < s.length(); i++) { s[i] = toupper(s[i]); if((s[i] >= 'A') && (s[i] <= 'Z')) s[i] = char(65 + (s[i] - 42) % 26); } // wypisujemy rozszyfrowany tekst cout << s << endl << endl; return 0; |