PY_I_R_W14_M15 Wybrane algorytmy szyfrujące
Symetryczne algorytmy szyfrowania
W tym e‑materiale omawiamy symetryczne algorytmy szyfrujące. Charakteryzują się one tym, że do szyfrowania i deszyfrowania tekstu jawnego wykorzystywane są te same klucze.
Szyfr polialfabetyczny
Szyfr polialfabetyczny jest szyfrem podstawieniowym. Do zaszyfrowania informacji wykorzystuje się więcej niż jeden alfabet szyfrowy. Dlatego tej samej literze w tekście po zaszyfrowaniu odpowiadają różne litery. Złamanie takiego szyfru jest trudniejsze, ponieważ nie można wykorzystać metody bazującej na częstości występowania liter w danym języku. Obecnie nie wykorzystuje się już szyfrów polialfabetycznych. Najbardziej znanymi szyframi tego typu są:
szyfr Vigenère’a,
szyfr Beauforta.
Omówimy pierwszy z nich, a także przedstawimy przykładowe szyfrowanie i deszyfrowanie.
Po raz pierwszy złamania szyfru dokonał w 1854 r. Charles Babbage. Jakich zasad należałoby się trzymać, by szyfr polialfabetyczny był trudniejszy do złamania?
W 1949 Claude Shannon udowodnił, że szyfr Vigenère’a może być szyfrem nie do złamania. Należy zachować jednak trzy reguły: klucz użyty do szyfrowania wiadomości musi być dłuższy lub równy szyfrowanej wiadomości; klucz musi być wygenerowany w sposób całkowicie losowy (nie może istnieć sposób na odtworzenie klucza na podstawie znajomości działania generatorów liczb pseudolosowych); klucz nie może być użyty do zaszyfrowania więcej niż jednej wiadomości. Dodatkowo jest wymagane, aby osoba znająca klucz nikomu go nie zdradziła.
Szyfr Vigenère'a
Szyfr ten opiera się na stworzeniu tablicy dwuwymiarowej o rozmiarze 26 wierszy na 26 kolumn, złożonej z wielkich liter alfabetu angielskiego, którymi jest zapisana wiadomość do zaszyfrowania.
Przykładowe szyfrowanie
Zaszyfrujmy tekst „ALA MA KOTA”, wykorzystując słowo kluczowe „SZYFR”.
Krok 1.
Zapisujemy tabelę niezbędną do szyfrowania. W pierwszym wierszu znajduje się alfabet angielski w niezmienionej formie: 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
Używając szyfru Vigenère’a, nie jesteśmy ograniczeni do szyfrowania słów składających się wyłącznie ze znaków alfabetu angielskiego. Tabelę możemy stworzyć na podstawie dowolnego alfabetu, np. polskiego.
Krok 2.
W kolejnym wierszu tabeli zapisujemy alfabet przesunięty o 1. Wiersz zaczyna się od litery „B” i kończy literą „A”. Zatem: 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 A
Krok 3.
Kolejne wiersze tabeli tworzymy w analogiczny sposób, jak wiersz w kroku 2. Cała tabela będzie wyglądała następująco:

Stworzyliśmy w ten sposób, wspomnianą we wprowadzeniu, tabula recta.
Krok 4.
Następnie zapisujemy słowo kluczowe tyle razy, by liczba znaków była równa liczbie znaków w tekście do zaszyfrowania.
Dla większej czytelności ciągi znaków zostały zaprezentowane w tabeli:
A | L | A | M | A | K | O | T | A |
S | Z | Y | F | R | S | Z | Y | F |
Krok 5.
Szyfrowanie przebiega w następujący sposób: litera po zaszyfrowaniu odpowiada literze z tabeli znajdującej się na przecięciu kolumny wyznaczanej przez literę tekstu jawnego i wiersza wyznaczanego przez literę słowa kluczowego. Zaszyfrujmy literę „A” ze słowa „ALA”. Odpowiadającą jej literą w słowie kluczowym jest „S”. Zatem zaszyfrowana litera „A” to „S”, ponieważ litera „S” jest zapisana w tabeli pod współrzędnymi wiersza „S” i kolumny „A”.

Zaszyfrowany tekst: „S”.
Krok 6.
Zaszyfrujmy literę „L” ze słowa „ALA”. Odpowiadającą jej literą w słowie kluczowym jest litera „Z”. Zatem zaszyfrowana litera „L” to „K”, ponieważ litera „K” jest zapisana w tabeli pod współrzędnymi wiersza „Z” i kolumny „L”.

Zaszyfrowany tekst: „SK”.
Krok 7.
Zaszyfrujmy literę „A” ze słowa „ALA”. Odpowiadającą jej literą w słowie kluczowym jest litera „Y”. Zatem zaszyfrowana litera „A” to „Y”, ponieważ litera „Y” jest zapisana w tabeli pod współrzędnymi wiersza „Y” i kolumny „A”.

Zaszyfrowany tekst: „SKY”.
Zwróć uwagę, że szyfrujemy po raz drugi literę „A”. Jednak tym razem szyfrujemy ją za pomocą innej litery niż w kroku 5, przez co otrzymaliśmy dwa różne znaki. W metodach szyfrowania, które omawialiśmy do tej pory, każda litera miała stały szyfrogram, przez co – raz odszyfrowana – była już jawna. W przypadku szyfru polialfabetycznego, by móc odszyfrować tekst, trzeba każdą literę z osobna deszyfrować.
Krok 8.
Zaszyfrujmy literę „M” ze słowa „MA”. Odpowiadającą jej literą w słowie kluczowym jest litera „F”. Zatem zaszyfrowana litera „M” to „R”, ponieważ litera „R” jest zapisana w tabeli, pod współrzędnymi wiersza „F” i kolumny „M”.

Zaszyfrowany tekst: „SKY R”.
Krok 9.
Zaszyfrujmy literę „A” ze słowa „MA”. Odpowiadającą jej literą w słowie kluczowym jest litera „R”. Zatem zaszyfrowana litera „A” to „R”, ponieważ litera „R” jest zapisana w tabeli pod współrzędnymi wiersza „R” i kolumny „A”.

Zaszyfrowany tekst: „SKY RR”.
Krok 10.
Zaszyfrujmy literę „K” ze słowa „KOTA”. Odpowiadającą jej literą w słowie kluczowym jest litera „S”. Zatem zaszyfrowana litera „K” to „C”, ponieważ litera „C” jest zapisana w tabeli pod współrzędnymi wiersza „S” i kolumny „K”.

Zaszyfrowany tekst: „SKY RR C”.
Krok 11.
Zaszyfrujmy literę „O” ze słowa „KOTA”. Odpowiadającą jej literą w słowie kluczowym jest litera „Z”. Zatem zaszyfrowana litera „O” to „N”, ponieważ litera „N” jest zapisana w tabeli pod współrzędnymi wiersza „Z” i kolumny „O”.

Zaszyfrowany tekst: „SKY RR CN”.
Krok 12.
Zaszyfrujmy literę „T” ze słowa „KOTA”. Odpowiadającą jej literą w słowie kluczowym jest litera „Y”. Zatem zaszyfrowana litera „T” to „R”, ponieważ litera „R” jest zapisana w tabeli pod współrzędnymi wiersza „Y” i kolumny „T”.

Zaszyfrowany tekst: „SKY RR CNR”.
Krok 13.
Zaszyfrujmy literę „A” ze słowa „KOTA”. Odpowiadającą jej literą w słowie kluczowym jest litera „F”. Zatem zaszyfrowana litera „A” to „F”, ponieważ litera „F” jest zapisana w tabeli pod współrzędnymi wiersza „F” i kolumny „A”.

Zaszyfrowany tekst: „SKY RR CNRF”.
Przykładowe deszyfrowanie
Powtórzmy kroki od 1. do 4., by uzyskać tabelę potrzebną do deszyfrowania oraz tekst do deszyfracji, a pod nim zapisany klucz szyfrujący.
Zaszyfrowany tekst: „IITXFMASV”
Słowo klucz: „MATURA”
Zapiszmy:
I | I | T | X | F | M | A | S | V |
M | A | T | U | R | A | M | A | T |
Zacznijmy deszyfrowanie.
Krok 1.
Deszyfrujemy literę „I”. Odszyfrowujemy ją za pomocą litery „M” z klucza. By to zrobić, znajdujemy wiersz zaczynający się od „M”, następnie w tym wierszu szukamy litery „I”. Gdy ją odnajdziemy, sprawdzamy odpowiadającą jej literę w pierwszym wierszu tabeli – wierszu z alfabetem bez przesunięć. W tym przypadku tą literą jest „W” i to ona jest pierwszą literą odszyfrowywanego tekstu.

Odszyfrowany tekst: „W”.
Krok 2.
Deszyfrujemy literę „I”. Odszyfrowujemy ją za pomocą litery „A” z klucza. By to zrobić, znajdujemy wiersz zaczynający się od „A”, następnie w tym wierszu szukamy litery „I”. Gdy ją odnajdziemy, sprawdzamy odpowiadającą jej literę w pierwszym wierszu tabeli. Kolejną literą odszyfrowanego tekstu jest „I”.

Odszyfrowany tekst: „WI”.
Krok 3.
Deszyfrujemy literę „T”. Odszyfrowujemy ją za pomocą litery „T” z klucza. By to zrobić, znajdujemy wiersz zaczynający się od „T”, następnie w tym wierszu szukamy litery „T”. Gdy ją odnajdziemy, sprawdzamy odpowiadającą jej literę w pierwszym wierszu tabeli. Kolejną literą odszyfrowanego tekstu jest „A”.

Odszyfrowany tekst: „WIA”.
Krok 4.
Deszyfrujemy literę „X”. Odszyfrowujemy ją za pomocą litery „U” z klucza. By to zrobić, znajdujemy wiersz zaczynający się od „U”, następnie w tym wierszu szukamy litery „X”. Gdy ją odnajdziemy, sprawdzamy odpowiadającą jej literę w pierwszym wierszu tabeli. Kolejną literą odszyfrowanego tekstu jest „D”.

Odszyfrowany tekst: „WIAD”.
Krok 5.
Deszyfrujemy literę „F”. Odszyfrowujemy ją za pomocą litery „R” z klucza. By to zrobić, znajdujemy wiersz zaczynający się od „R”, następnie w tym wierszu szukamy litery „F”. Gdy ją odnajdziemy, sprawdzamy odpowiadającą jej literę w pierwszym wierszu tabeli. Kolejną literą odszyfrowanego tekstu jest „O”.

Odszyfrowany tekst: „WIADO”.
Krok 6.
Deszyfrujemy literę „M”. Odszyfrowujemy ją za pomocą litery „A” z klucza. By to zrobić, znajdujemy wiersz zaczynający się od „A”, następnie w tym wierszu szukamy litery „M”. Gdy ją odnajdziemy, sprawdzamy odpowiadającą jej literę w pierwszym wierszu tabeli. Kolejną literą odszyfrowanego tekstu jest „M”.

Odszyfrowany tekst: „WIADOM”.
Krok 7.
Deszyfrujemy literę „A”. Odszyfrowujemy ją za pomocą litery „M” z klucza. By to zrobić, znajdujemy wiersz zaczynający się od „M”, następnie w tym wierszu szukamy litery „A”. Gdy ją odnajdziemy, sprawdzamy odpowiadającą jej literę w pierwszym wierszu tabeli. Kolejną literą odszyfrowanego tekstu jest „O”.

Odszyfrowany tekst: „WIADOMO”.
Krok 8.
Deszyfrujemy literę „S”. Odszyfrowujemy ją za pomocą litery „A” z klucza. By to zrobić, znajdujemy wiersz zaczynający się od „A”, następnie w tym wierszu szukamy litery „S”. Gdy ją odnajdziemy, sprawdzamy odpowiadającą jej literę w pierwszym wierszu tabeli. Kolejną literą odszyfrowanego tekstu jest „S”.

Odszyfrowany tekst: „WIADOMOS”.
Krok 9.
Deszyfrujemy literę „V”. Odszyfrowujemy ją za pomocą litery „T” z klucza. By to zrobić, znajdujemy wiersz zaczynający się od „T”, następnie w tym wierszu szukamy litery „V”. Gdy ją odnajdziemy, sprawdzamy odpowiadającą jej literę w pierwszym wierszu tabeli. Ostatnią literą odszyfrowanego tekstu jest „C”.

Odszyfrowany tekst: „WIADOMOSC”.
Zapis szyfru Vigenère'a za pomocą pseudokodu
Specyfikacja:
Dane:
Tekst– tekst jawny, który mamy zaszyfrować; ciąg znaków składający się jedynie z wielkich liter alfabetu angielskiegoKlucz– klucz szyfrujący; ciąg znaków
Wynik:
Zaszyfrowany metodą Vigenère'a (z użyciem klucza szyfrującego Klucz) łańcuch znaków Tekst.
W pseudokodzie wykorzystamy trzy dodatkowe funkcje:
konwertujZnak– funkcja konwertująca znak na odpowiadający mu kod ASCII (liczbę naturalną);konwertujLiczba– funkcja konwertująca kod ASCII (liczbę naturalną) na odpowiadający mu znak według identycznych założeń jak funkcjakonwertujZnak;długość– funkcja zwracająca długość ciągu znaków.
Proces szyfrowania rozpoczynamy od pobrania tekstu jawnego i klucza szyfrującego od użytkownika. Zakładamy, że użytkownik wprowadza jedynie wielkie litery alfabetu angielskiego.
Tabelę tworzymy w sposób następujący: wiersz pierwszy to alfabet zapisany w wersji bez zmian. Każdy kolejny wiersz zaczyna się od drugiej (licząc od początku) litery w wierszu poprzednim. Operować będziemy na kodach ASCII z zakresu od 65 do 90, odpowiadających wielkim literom alfabetu angielskiego, dlatego też musimy wykorzystać operację modulo (by wartości kodów nie były większe niż 90).
Kolejnym krokiem w szyfrze Vigenère'a jest wykorzystanie słowa kluczowego. Jeśli słowo kluczowe ma mniej znaków niż tekst do zaszyfrowania, to zapisujemy je jedno za drugim, tyle razy, by liczba zapisanych znaków była równa liczbie liter w tekście do zaszyfrowania.
W omawianym algorytmie wykorzystujemy zmienną pomocniczą PoczatkowaDługośćKlucza, której ustawiamy wartość równą wartości zmiennej DługośćKlucza przed rozpoczęciem pętli. Następnie wykonujemy pętlę Dopóki, dopóki wartość zmiennej DługośćKlucza jest mniejsza od wartości zmiennej DługośćTekstu. W pętli do obecnej wartości klucza dopisujemy znak o numerze indeksu równemu 1 + DługośćKlucza - PoczątkowaDługośćKlucza. Takie działanie pozwoli nam dopisywać znaki w takiej kolejności, w jakiej były one zawarte w podanym kluczu. Ostatnim krokiem wykonywanym w pętli jest zwiększenie wartości zmiennej DługośćKlucza o 1.
Następnie szyfrujemy litera po literze. Odczytujemy znak w tekście do zaszyfrowania, odczytujemy odpowiadający mu znak ze słowa kluczowego. Następnie szukamy odpowiedniego znaku w tabeli. Przykładowo, jeśli litera z tekstu do zaszyfrowania to „C”, a znak ze słowa kluczowego to „G”, to szyfrując „C”, otrzymamy znak zapisany w tabeli pod współrzędnymi: wiersz „C” kolumna „G”.
Kroki powtarzamy do momentu zaszyfrowania całego tekstu.
Gotowy program:
Odszyfrowywanie wiadomości
Odszyfrowywanie polega na odnalezieniu w tabeli wiersza zaczynającego się od litery z klucza, odpowiadającej literze tekstu zaszyfrowanego, którą odszyfrowujemy. Następnie w tym wierszu odnajdujemy literę, którą mamy zamiar odszyfrować. Po jej odnalezieniu odczytujemy literę znajdującą się w tej samej kolumnie, ale w pierwszym wierszu tabeli – tym, w którym alfabet jest zapisany bez przesunięcia.
Słownik
informacja niezbędna do wykonania szyfrowania oraz deszyfrowania; w zależności od szyfru kluczem może być liczba bądź tekst