Szyfrowanie informacji ma na celu ukrycie jej przed osobami niepowołanymi. Pierwsze dowody ukrywania informacji za pomocą szyfrów datują się na rok 4000 p.n.e. i pochodzą ze starożytnego Egiptu. Egipscy kapłani ukrywali ważne informacje stosując specjalne szyfrowanie hieroglifów. Również inne ludy świata starożytnego korzystały z różnych szyfrów.
Szyfrowanie nie ogranicza się tylko do tajnych służb rządowych i szpiegostwa. Wykorzystywane jest dzisiaj szeroko we wszelkich transakcjach handlowych dokonywanych poprzez sieć Internet, gdzie osoby trzecie nie powinny odczytywać przesyłanych informacji - przecież nie chciałbyś, aby twój numer konta i hasło bankowe wpadły w ręce kogoś obcego, kto natychmiast dokonałby wspaniałych zakupów w twoim imieniu. To samo odnosi się do korespondencji prywatnej i zawodowej - nie chcemy, aby obcy ludzie czytali nasze sekrety. Dlatego informatycy i matematycy na całym świecie intensywnie pracują nad stworzeniem niezawodnych i bezpiecznych metod szyfrowania informacji. W tym i następnym rozdziale postaramy się przybliżyć wam to zagadnienie.
Sławny szyfr Cezara polegał na zastępowaniu każdego znaku tekstu znakiem odległym o 3 pozycje w alfabecie. Literki z końca alfabetu były zamieniane przez literki z początku alfabetu.
Poniżej podajemy tablicę kodową. U góry znajdują się kodowane literki, a u dołu te, które je zastąpią po zaszyfrowaniu informacji:
tekst 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 szyfr D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
Szyfrowanie:
TERA EST ROTUNDA
WHUD HVW URWXQGDRozszyfrowywanie polega na zastępowaniu literek szyfru literkami z górnej kolumny:
DYH FHDPDU
AVE CEASAROczywiście kody tego typu nie mają większego zastosowania, ponieważ bardzo łatwo je złamać. Dla 26 liter alfabetu można utworzyć maksymalnie 25 różnych kodów Cezara (właściwie 26, lecz dla zerowego odstępu szyfr jest równoważny szyfrowanemu tekstowi). Wystarczy więc sprawdzić każdy z nich, aż dostaniemy rozszyfrowaną wiadomość, co nie jest specjalnie trudne dla współczesnych komputerów.
Znaki są przechowywane w pamięci komputera w postaci liczb zwanych kodami znaków. Każda literka ma przyporządkowany sobie numer. W poniższej tabelce zebraliśmy kody literek od A do Z w kodzie ASCII (American Standard Code for Information Interchange - Amerykański, Standardowy Kod dla Wymiany Informacji).
Litera | A | B | C | D | E | F | G | H | I | J | L | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Kod ASCII | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 |
Klucz szyfrujący jest informacją, która pozwala zaszyfrować dane lub odczytać dane zaszyfrowane. W przypadku kodu Cezara kluczem jest wartość przesunięcia w alfabecie literek kodu względem literek tekstu jawnego. Przy szyfrowaniu przesunięcie dodajemy do kodu znaku. Przy rozszyfrowywaniu przesunięcie odejmujemy od kodu znaku. Obie operacje spisują się dobrze w środku alfabetu.
Przesunięcie d wynosi 3. Szyfrujemy literkę F. Kod literki F jest równy 70. Po dodaniu przesunięcia 3 otrzymujemy kod zaszyfrowanej literki 73. Jest to literka I:
F dla klucza d=3 szyfruje się na I
Rozszyfrowujemy literkę X. Kod X wynosi 88. Po odjęciu przesunięcia 3 otrzymujemy kod 85, który odpowiada literce U:
X dla klucza d=3 rozszyfrowuje się na U
Problem pojawia się przy literkach skrajnych, gdy dodanie przesunięcia daje kod większy od 90 lub odjęcie przesunięcia daje kod mniejszy od 65. Jeśli umówimy się, iż alfabet tworzy pierścień zamknięty, to po literce Z następuje A. Literkę A poprzedza Z:
Znak ... X Y Z A B C ... X Y Z A B C ... ... 62 63 64 65 66 67 ... 88 89 90 91 92 93 ... Kod ... 88 89 90 65 66 67 ... 88 89 90 65 66 67 ... Jeśli w wyniku dodania przesunięcia otrzymamy wartość większą od 90 (np. 92), to od tego wyniku należy odjąć 26, aby otrzymać poprawny kod szyfru (92 - 26 = 66, czyli literka B). Jeśli z kolei w wyniku odjęcia przesunięcia otrzymamy wartość mniejszą od 65 (np. 63), to do tego wyniku należy dodać 26, aby otrzymać rozkodowany znak (63 + 26 = 89, czyli literka Y).
Poniżej podajemy szczegółowy algorytm dla funkcji Cezar(z,d), która dokonuje szyfrowania lub rozszyfrowania podanego znaku z przy kluczu d.
Dane wejściowe
z - znak ASCII do zaszyfrowania lub znak ASCII zaszyfrowany, z {'A','B',...,'Z'}. Znak z jest argumentem funkcji Cezar(z,d). d - przesunięcie dodatnie dla szyfrowania i ujemne dla rozszyfrowywania, d C, d <-25,25>. Przesunięcie d jest argumentem funkcji Cezar(z,d). Dane wyjściowe
Zaszyfrowany znak z (d > 0) lub rozszyfrowany znak z (d < 0). Jeśli znak z nie jest dużą literą alfabetu, to zostaje zwrócony bez zmian. Wynik jest wartością funkcji Cezar(z,d).
Zmienne pomocnicze i funkcje
c - wyliczany kod cezara, c N kod(znak) - funkcja zwracająca kod znaku ASCII podanego jako argument znak(kod) - funkcja zwracająca znak ASCII o kodzie podanym jako argument
krok 1: Jeżeli z {'A','B',...,'Z'}, to idź do kroku 2. Inaczej Cezar(z,d) z i zakończ algorytm. krok 2: c kod(z) + d krok 3: Jeśli c > 90, to c c - 26 krok 4: Jeśli c < 65, to c c + 26 krok 5: Cezar(z,d) znak(c) krok 6: Zakończ algorytm
Sprawdzamy, czy znak z należy do zbioru liter od A do Z. Jeśli nie, to nie szyfrujemy go, lecz zwracamy bez zmian. Takie podejście umożliwi wstawianie do naszego kodu spacji oraz innych znaków interpunkcyjnych.
Jeśli znak należy do zbioru liter od A do Z, wyznaczamy dla niego kod Cezara. W tym celu do kodu znaku dodajemy przesunięcie d. W wyniku możemy otrzymać wartość większą od 90 (dla d dodatniego) lub mniejszą od 65 (dla d ujemnego). W takim razie odpowiednio dodajemy do kodu lub odejmujemy od niego liczbę 26, aby otrzymać poprawny kod Cezara.
Jako wynik zwracamy znak o wyliczonym kodzie i kończymy algorytm.
Program pobiera od użytkownika klucz d oraz tekst, który ma zostać zaszyfrowany lub rozszyfrowany. Tekst musi być wprowadzony dużymi literami. Przy rozszyfrowywaniu należy zawsze podać klucz o wartości przeciwnej niż przy szyfrowaniu. Pobrany tekst jest rozbijany na kolejne znaki, które przesyła się wraz z kluczem do funkcji Cezar. Wyniki z funkcji Cezar są wyświetlane kolejno w okienku konsoli.
Prezentowany program jest bardzo prymitywny i posiada jedynie wartość dydaktyczną, chociaż...
Wydruk z uruchomionego programu |
---|
S Z Y F R C E Z A R A |
S Z Y F R C E Z A R A |
Microsoft Visual Basic 2005 Express Edition |
Zwróć uwagę, iż w szyfrze Cezara tym samym literom zawsze odpowiadają takie same znaki szyfru. Na przykład literce D odpowiada znak S, literce A znak P. Własność ta ułatwia złamanie kodu.
Poniższe, przykładowe programy są praktyczną realizacją omawianego w tym rozdziale algorytmu. Zapewne można je napisać bardziej efektywnie. To już twoje zadanie. Dokładny opis stosowanych środowisk programowania znajdziesz we wstępie. Programy przed opublikowaniem w serwisie edukacyjnym zostały dokładnie przetestowane. Jeśli jednak znajdziesz jakąś usterkę (co zawsze może się zdarzyć), to prześlij o niej informację do autora. Pozwoli to ulepszyć nasze artykuły. Będziemy Ci za to wdzięczni.
Przeanalizuj przedstawiony w tym rozdziale algorytm i określ, dla jakich wartości przesunięcia d przestaje on poprawnie pracować? Zaproponuj usunięcie tej niedogodności. Uniezależnij kodowanie od wielkości literek.
Ambitnym proponujemy utworzenie programu rozkodowującego dowolny tekst zakodowany szyfrem Cezara.
Więcej informacji na temat metod szyfrowania znajdziesz w artykule o komputerach Colossus.
Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.
Źródło: mgr Jerzy Wałaszek