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.
Ciekawostka
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
Ważne!
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:
R1EcaSYdyhLmZ
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”.
RJAL9AMZ1t9bL
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”.
R1HkHFKYzy8Ec
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”.
R1e2xutQAwYUD
Zaszyfrowany tekst: „SKY”.
Ważne!
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”.
RgZT2yksDbN35
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”.
RW1euaBr8DUfj
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”.
RuO4wO7gppm0h
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”.
RVCkMuyUgtuCt
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”.
RLCh2d8h16GPA
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”.
RcTFO2PwJ2fEf
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ącyklucz szyfrującyklucz 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.
R1SI6wddCWrYf
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”.
RKIpgi7SyXPYj
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”.
R1apZmuuh8Yy3
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”.
RMNYCndfKVOyM
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”.
R1DB1C6JZaFPD
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”.
R1ZwwgiV6sCU1
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”.
R1eLy0pZ0waJT
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”.
RKfHvZK21fw9b
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”.
RmJInAsXjvS4x
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 angielskiego
Klucz – 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.
Ważne!
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 funkcja konwertujZnak;
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.
Linia 1. Tekst ← wprowadź ciąg znaków.
Linia 2. Klucz ← wprowadź ciąg znaków.
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).
Linia 1. tab otwórz nawias kwadratowy 1 kropka kropka 26 zamknij nawias kwadratowy otwórz nawias kwadratowy 1 kropka kropka 26 zamknij nawias kwadratowy.
Linia 2. Dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka 26 wykonuj.
Linia 3. Dla j znak równości 1 przecinek 2 przecinek kropka kropka kropka 26 wykonuj.
Linia 4. tab otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy ← konwertujLiczba otwórz nawias okrągły konwertujZnak otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły plus otwórz nawias okrągły otwórz nawias okrągły otwórz nawias okrągły i minus 1 zamknij nawias okrągły plus otwórz nawias okrągły j minus 1 zamknij nawias okrągły zamknij nawias okrągły mod 26 zamknij nawias okrągły zamknij nawias okrągły.
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.
Linia 1. DługośćKlucza ← długość otwórz nawias okrągły Klucz zamknij nawias okrągły.
Linia 2. PoczatkowaDługośćKlucza ← DługośćKlucza.
Linia 3. Dopóki DługośćKlucza otwórz nawias ostrokątny długość otwórz nawias okrągły Tekst zamknij nawias okrągły wykonuj.
Linia 4. Klucz ← Klucz plus Klucz otwórz nawias kwadratowy otwórz nawias okrągły DługośćKlucza minus PoczątkowaDługośćKlucza zamknij nawias okrągły plus 1.
Linia 5. DługośćKlucza ← DługośćKlucza plus 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.
Linia 1. Dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka DługośćTekstu wykonuj.
Linia 2. ZnakTekst ← Tekst otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 3. ZnakKlucz ← Klucz otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 4. ZaszyfrowanaWiadomość ← ZaszyfrowanaWiadomość plus tab otwórz nawias kwadratowy otwórz nawias okrągły konwertujZnak otwórz nawias okrągły ZnakTekst zamknij nawias okrągły mod 65 zamknij nawias okrągły plus 1 zamknij nawias kwadratowy otwórz nawias kwadratowy otwórz nawias okrągły konwertujZnak otwórz nawias okrągły ZnakKlucz zamknij nawias okrągły mod 65 zamknij nawias okrągły plus 1 zamknij nawias kwadratowy.
Gotowy program:
Linia 1. Tekst ← wprowadź ciąg znaków.
Linia 2. Klucz ← wprowadź ciąg znaków.
Linia 3. ZaszyfrowanaWiadomość ← cudzysłów cudzysłów.
Linia 5. tab otwórz nawias kwadratowy 1 kropka kropka 26 zamknij nawias kwadratowy otwórz nawias kwadratowy 1 kropka kropka 26 zamknij nawias kwadratowy.
Linia 6. Dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka 26 wykonuj.
Linia 7. Dla j znak równości 1 przecinek 2 przecinek kropka kropka kropka 26 wykonuj.
Linia 8. tab otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy ← konwertujLiczba otwórz nawias okrągły konwertujZnak otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły plus otwórz nawias okrągły otwórz nawias okrągły otwórz nawias okrągły i minus 1 zamknij nawias okrągły plus otwórz nawias okrągły j minus 1 zamknij nawias okrągły zamknij nawias okrągły mod 26 zamknij nawias okrągły zamknij nawias okrągły.
Linia 10. DługośćKlucza ← długość otwórz nawias okrągły Klucz zamknij nawias okrągły.
Linia 11. PoczatkowaDługośćKlucza ← DługośćKlucza.
Linia 12. Dopóki DługośćKlucza otwórz nawias ostrokątny długość otwórz nawias okrągły Tekst zamknij nawias okrągły wykonuj.
Linia 13. Klucz ← Klucz plus Klucz otwórz nawias kwadratowy otwórz nawias okrągły DługośćKlucza minus PoczątkowaDługośćKlucza zamknij nawias okrągły plus 1 zamknij nawias kwadratowy.
Linia 14. DługośćKlucza ← DługośćKlucza plus 1.
Linia 16. Dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka DługośćTekstu wykonuj.
Linia 17. ZnakTekst ← Tekst otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 18. ZnakKlucz ← Klucz otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 19. ZaszyfrowanaWiadomość ← ZaszyfrowanaWiadomość plus tab otwórz nawias kwadratowy otwórz nawias okrągły konwertujZnak otwórz nawias okrągły ZnakTekst zamknij nawias okrągły mod 65 zamknij nawias okrągły plus 1 zamknij nawias kwadratowy otwórz nawias kwadratowy otwórz nawias okrągły konwertujZnak otwórz nawias okrągły ZnakKlucz zamknij nawias okrągły mod 65 zamknij nawias okrągły plus 1 zamknij nawias kwadratowy.
Linia 21. zwróć ZaszyfrowanaWiadomość.
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.
Linia 1. OdszyfrowanaWiadomość ← cudzysłów cudzysłów.
Linia 3. Dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka przecinek DługośćTekstu wykonuj.
Linia 4. ZnakTekst ← Tekst otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 5. ZnakKlucz ← Klucz otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 6. x ← 1.
Linia 7. y ← 1.
Linia 8. Dopóki ZnakKlucz ≠ tab otwórz nawias kwadratowy x zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy wykonuj.
Linia 9. x ← x plus 1.
Linia 10. Dopóki ZnakTekst ≠ tab otwórz nawias kwadratowy x zamknij nawias kwadratowy otwórz nawias kwadratowy y zamknij nawias kwadratowy wykonuj.
Linia 11. y ← y plus 1.
Linia 12. OdszyfrowanaWiadomość ← OdszyfrowanaWiadomość plus tab otwórz nawias kwadratowy 1 zamknij nawias kwadratowy otwórz nawias kwadratowy y zamknij nawias kwadratowy.
Linia 13. zwróć OdszyfrowanaWiadomość.
Słownik
klucz szyfrujący
klucz szyfrujący
informacja niezbędna do wykonania szyfrowania oraz deszyfrowania; w zależności od szyfru kluczem może być liczba bądź tekst