Ludzie od wieków stosowali rozmaite metody, by chronić ważne, poufne informacje. Spartanom przypisuje się autorstwo pierwszego narzędzia szyfrującego o nazwie skytale – był to skórzany lub pergaminowy pasek, na którym znajdowały się litery, odczytanie wiadomości było możliwe po nawinięciu go na laskę takiej samej grubości, jaką miał autor wiadomości. W trakcie wojny światowej Niemcy wykorzystywali urządzenie szyfrujące Enigma, a Polacy wsławili się dzięki rozszyfrowaniu wiadomości wojskowych, które ta maszyna szyfrowała. Do szyfrowaniaszyfrowanieszyfrowania nie zawsze konieczne są specjalne urządzenia, czasami wystarczy kartka i ołówek.
Rozmawiając ze znajomymi, korzystasz z różnych komunikatorów. Czasami zdarza się, że chcesz przekazać jakąś poufną informację. Zależy ci, by nikt poza odbiorcą jej nie przeczytał. Z pomocą może przyjść kryptografiakryptografiakryptografia.
Istnieje wiele algorytmów szyfrujących, które można wykorzystać. Najczęściej stosowane algorytmy polegają na specyficznym przekształceniu wiadomości za pomocą kluczakluczklucza.
Szyfry możemy podzielić na kilka rodzajów:
szyfr podstawieniowy – każdy znak szyfrowanej wiadomości zostaje zastąpiony innym; deszyfrowanie polega na odwróceniu podstawienia; przykładem takiego szyfru jest szyfr CezaraPvJJ5fOYkszyfr Cezara;
szyfr przestawieniowy – w zaszyfrowanej wiadomości obecne są wszystkie znaki użyte w tekście jawnym, zmieniona zostaje jedynie ich pozycja w szyfrogramieszyfrogramszyfrogramie; przykładem takiego szyfru jest szyfr płotkowy;
szyfr symetryczny – wiadomość jest szyfrowana za pomocą tajnego klucza, który następnie służy do odczytania wiadomości;
szyfr asymetryczny – wiadomość zostaje zaszyfrowana oraz deszyfrowana różnymi kluczami; klucz używany w procesie szyfrowania jest publicznyklucz publicznypubliczny, natomiast drugi klucz, wykorzystywany podczas deszyfrowania, jest prywatnyklucz prywatnyprywatny; przykładem takiego szyfru jest szyfr RSAPl0GrlFTpszyfr RSA.
W dalszej części materiału poznasz przykład szyfru przedstawieniowego – szyfr płotkowy.
Szyfr płotkowy – opis algorytmu szyfrowania
Chcesz przekazać przyjacielowi tajne miejsce waszego spotkania – punktem zbiórki jest fontanna w parku.
Aby zaszyfrować wiadomość za pomocą szyfru płotkowego, na początku należy wybrać klucz symetryczny, za pomocą którego zaszyfrujemy wiadomość. W przypadku tego algorytmu kluczem będzie wysokość płotku, czyli w podanym przykładzie: pięć kwadratów.
RmBQGOi8B89cM
Pierwszym krokiem będzie właściwe przygotowanie wiadomości. Należy zmienić wielkość wszystkich liter na duże (np. a na A) oraz usunąć spacje. Zmiana wielkości liter utrudni odczytanie szyfrogramu przez niepowołaną osobę. W efekcie otrzymamy następujący tekst:
FONTANNAWPARKU
Następnie należy wypełnić pola w płotku literami tekstu jawnego, począwszy od lewej górnej kratki schematu. W każdym kolejnym kroku następny znak szyfrowanego tekstu wpisujemy do pola diagramu ulokowanego o jedną pozycję na prawo oraz w dół w stosunku do poprzedniej kratki. W momencie, w którym osiągniemy pole znajdujące się w najniższym rzędzie płotku, zmieniamy kierunek wyboru kolejnych kratek – każde następne pole będzie zlokalizowane o jedną pozycję na prawo oraz do góry w stosunku do poprzedniej kratki. Gdy dotrzemy do pozycji w rzędzie najwyższym, ponownie zmieniamy kierunek. Proces ten powtarzamy, aż do wpisania w pola płotku wszystkich liter tekstu jawnego. Utworzony przez znaki kształt powinien przypominać zygzak.
R1VQovVYDGpim
Kolejne litery odczytujemy w wierszach, zaczynając zawsze od lewej strony. W ten sposób otrzymamy następujący zaszyfrowany tekst:
FWOAPNNATNRUAK
Aby twój przyjaciel mógł odczytać informację, należy przekazać mu zaszyfrowaną wiadomość wraz z kluczem symetrycznym.
Pseudokod algorytmu szyfrowania płotkowego
Specyfikacja problemu:
Dane:
n – liczba naturalna; liczba znaków w tekście jawnym
tekst[0..n - 1] – przekazany do zaszyfrowania szyfrem płotkowym tekst jawny; tablica znaków zawierająca wielkie i małe litery alfabetu angielskiego oraz spacje
klucz – liczba rzędów, z których składa się wykorzystywany w szyfrowaniu schemat płotku; liczba naturalna dodatnia.
Wynik:
szyfrogram[0..m - 1] – zaszyfrowany szyfrem płotkowym tekst jawny; tablica znaków zawierająca wielkie litery alfabetu angielskiego; gdzie m jest równe n minus liczba spacji w tekście jawnym
Ważne!
W wykonaniu opisanych w algorytmie operacji przydatne będzie operowanie na kodach ASCIIkod ASCIIkodach ASCII, pozwalających reprezentować wybrane znaki, np. litery, cyfry czy znaki interpunkcyjne w postaci liczb całkowitych z zakresu od 0 do 127.
W pseudokodzie wykorzystamy trzy dodatkowe funkcje:
znakDoKodu(znak) – funkcja, która jako parametr przyjmuje pojedynczy znak, a następnie konwertuje go na odpowiadający mu kod ASCII i zwraca otrzymaną wartość liczbową.
kodDoZnaku(kod) – funkcja, która jako parametr przyjmuje kod ASCII w postaci liczby całkowitej z zakresu od 0 do 127, a następnie konwertuje ją na odpowiadający jej znak oraz go zwraca.
rozmiar(tablica) – funkcja, która jako parametr przyjmuje tablicę, a następnie podaje liczbę jej elementów.
Do funkcji szyfrującej przekazywany jest podany przez użytkownika tekst jawny, liczba znaków w nim zawarta oraz klucz. Postępujemy według przedstawionego schematu.
Krok 1. Usuń spacje i zmień małe litery na wielkie, jeżeli jest to konieczne.
W funkcji początkowo definiujemy tablicę jawny[] o długości n, która docelowo przechowywać będzie tekst jawny składający się jedynie z wielkich liter alfabetu angielskiego (po usunięciu spacji oraz zmianie małych liter na wielkie). Dodatkowo przydatne będzie utworzenie zmiennej a wskazującej na indeks elementu tablicy jawny[], do którego zapisywać będziemy znak tekstu jawnego. Inicjalizujemy ją wartością 1.
Linia 1. funkcja szyfrPlotkowy otwórz nawias okrągły tekst otwórz nawias kwadratowy 0 kropka kropka n minus 1 zamknij nawias kwadratowy przecinek klucz zamknij nawias okrągły.
Linia 2. jawny otwórz nawias kwadratowy 0 kropka kropka n minus 1 zamknij nawias kwadratowy ← wprowadzamy wiadomość do zaszyfrowania.
Linia 3. a ← 1.
Każdy element tablicy tekst[] porównujemy ze znakiem „ „ (spacja). Jeżeli dany element nie jest spacją, to weryfikujemy, czy stanowi małą literę alfabetu poprzez sprawdzenie, czy jego kod ASCII jest większy lub równy kodowi litery „a”. Zasadność takiego porównania wynika z faktu, że małe litery w kodzie ASCII mają wartości od 97 do 122, a wielkie od 65 do 90. Jeżeli sprawdzany znak okaże się małą literą, pomniejszamy jego kod ASCII o 32 i zapisujemy do tablicy tekst[]. Jest to stała różnica pomiędzy kodami tej samej litery w wariancie wielkim i małym, np. „a” (97) oraz „A” (65), czyli 97 - 65 = 32. W ten sposób małe litery zostają zamienione na wielkie. Niezależnie, czy przeprowadzona została operacja zmiany wielkości litery, sprawdzany znak (o ile nie jest spacją) zapisujemy do elementu tablicy jawny[] o indeksie a. Na koniec inkrementujemy wartość zmiennej a.
Linia 1. funkcja szyfrPlotkowy otwórz nawias okrągły tekst otwórz nawias kwadratowy 0 kropka kropka n minus 1 zamknij nawias kwadratowy przecinek klucz zamknij nawias okrągły.
Linia 2. jawny otwórz nawias kwadratowy 0 kropka kropka n minus 1 zamknij nawias kwadratowy ← wprowadzamy wiadomość do zaszyfrowania.
Linia 3. a ← 1.
Linia 5. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek.
Linia 6. jeżeli tekst otwórz nawias kwadratowy i zamknij nawias kwadratowy ≠ apostrof apostrof dwukropek.
Linia 7. jeżeli znakDoKodu otwórz nawias okrągły tekst otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły zamknij nawias ostrokątny znak równości znakDoKodu otwórz nawias okrągły apostrof a apostrof zamknij nawias okrągły wykonaj dwukropek.
Linia 8. tekst otwórz nawias kwadratowy i zamknij nawias kwadratowy ← kodDoZnaku otwórz nawias okrągły znakDoKodu otwórz nawias okrągły tekst otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły minus 32 zamknij nawias okrągły.
Linia 9. jawny otwórz nawias kwadratowy a zamknij nawias kwadratowy ← tekst otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 10. a ← a plus 1.
Krok 2. Określ liczbę znaków w tekście jawnym po przeprowadzonych operacjach usuwania spacji oraz zmiany wielkości liter.
Długość tablicy jawny[] początkowo określiliśmy jako n, ponieważ jest to maksymalna liczba znaków, które może zawierać tekst jawny po usunięciu spacji (w przypadku gdy pierwotnie nie znajdowały się w nim żadne spacje). Może jednak dojść do sytuacji, że długość tekstu – po wykonaniu opisanych operacji – ulegnie zmianie. Aby określić liczbę liter w tablicy jawny[], sprawdzimy, ile z jej elementów posiada kod ASCII pomiędzy 65 (kod litery „A”) a 90 (kod litery „Z”). Poszukiwaną długość tekstu jawnego, po modyfikacjach, przechowywać będziemy w zmiennej m.
Linia 1. m ← 0.
Linia 2. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek.
Linia 3. jeżeli znakDoKodu otwórz nawias okrągły jawny otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły zamknij nawias ostrokątny znak równości znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły i znakDoKodu otwórz nawias okrągły jawny otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias ostrokątny znak równości znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek.
Linia 4. m ← m plus 1.
Krok 3. Umieść tekst jawny w tablicy dwuwymiarowej.
Tworzymy tablicę plotek[][] zawierającą liczbę wierszy równą kluczowi oraz składającą się z liczby kolumn równej wartości zmiennej m. Wypełniamy ją znakami spacji. Następnie uzupełniamy ją kolejnymi znakami tekstu jawnego w formie opisanego w szyfrze płotkowym zygzaka. Pomoże nam w tym flaga dol, która będzie zmieniać swoją wartość na 1 (gdy tekst będzie iść w dół) lub 0 (gdy tekst będzie iść do góry) – w zależności od tego, czy osiągnięta zostanie minimalna lub maksymalna wysokość tablicy plotek[][].
Linia 1. plotek otwórz nawias kwadratowy 0 kropka kropka klucz minus 1 zamknij nawias kwadratowy otwórz nawias kwadratowy 0 kropka kropka m minus 1 zamknij nawias kwadratowy.
Linia 2. wiersz ← 1.
Linia 3. dol ← 1.
Linia 5. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek klucz minus 1 wykonuj dwukropek.
Linia 6. dla j znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek m minus 1 wykonuj dwukropek.
Linia 7. plotek otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy ← apostrof apostrof.
Linia 8. i ← 1.
Linia 10. dopóki i otwórz nawias ostrokątny znak równości m wykonuj dwukropek.
Linia 11. plotek otwórz nawias kwadratowy wiersz zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy ← jawny otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 12. i ← i plus 1.
Linia 14. jeżeli wiersz znak równości klucz dwukropek.
Linia 15. dol ← 0.
Linia 16. jeżeli wiersz znak równości 1 dwukropek.
Linia 17. dol ← 1.
Linia 18. jeżeli dol znak równości 1 dwukropek.
Linia 19. wiersz ← wiersz plus 1.
Linia 20. w przeciwnym razie dwukropek.
Linia 21. wiersz ← wiersz minus 1.
Krok 4. Odczytaj zaszyfrowaną wiadomość.
Na koniec definiujemy tablicę szyfrogram o długości m, a następnie zapisujemy do niej litery, którymi wypełniliśmy pola utworzonego płotku (według zasad szyfru płotkowego). Rezultat przedstawionych operacji zwracamy.
Linia 1. szyfrogram otwórz nawias kwadratowy 0 kropka kropka m minus 1 zamknij nawias kwadratowy.
Linia 2. b ← 1.
Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek klucz minus 1 wykonuj dwukropek.
Linia 5. dla j znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek m minus 1 wykonuj dwukropek.
Linia 6. jeżeli plotek otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy ≠ apostrof apostrof dwukropek.
Linia 7. szyfrogram otwórz nawias kwadratowy b zamknij nawias kwadratowy ← plotek otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy.
Linia 8. b ← b plus 1.
Linia 10. zwróć szyfrogram otwórz nawias kwadratowy zamknij nawias kwadratowy.
Krok 5. Gotowa funkcja zapisana w pseudokodzie.
Linia 1. funkcja szyfrPlotkowy otwórz nawias okrągły tekst otwórz nawias kwadratowy 0 kropka kropka n minus 1 zamknij nawias kwadratowy przecinek klucz zamknij nawias okrągły.
Linia 2. jawny otwórz nawias kwadratowy 0 kropka kropka n minus 1 zamknij nawias kwadratowy ← wprowadzamy wiadomość do zaszyfrowania.
Linia 3. a ← 1.
Linia 5. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek.
Linia 6. jeżeli tekst otwórz nawias kwadratowy i zamknij nawias kwadratowy ≠ apostrof apostrof dwukropek.
Linia 7. jeżeli znakDoKodu otwórz nawias okrągły tekst otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły zamknij nawias ostrokątny znak równości znakDoKodu otwórz nawias okrągły apostrof a apostrof zamknij nawias okrągły wykonaj dwukropek.
Linia 8. tekst otwórz nawias kwadratowy i zamknij nawias kwadratowy ← kodDoZnaku otwórz nawias okrągły znakDoKodu otwórz nawias okrągły tekst otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły minus 32 zamknij nawias okrągły.
Linia 9. jawny otwórz nawias kwadratowy a zamknij nawias kwadratowy ← tekst otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 10. a ← a plus 1.
Linia 12. m ← 0.
Linia 13. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek.
Linia 14. jeżeli znakDoKodu otwórz nawias okrągły jawny otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły zamknij nawias ostrokątny znak równości znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły i znakDoKodu otwórz nawias okrągły jawny otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias ostrokątny znak równości znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek.
Linia 15. m ← m plus 1.
Linia 17. plotek otwórz nawias kwadratowy 0 kropka kropka klucz minus 1 zamknij nawias kwadratowy otwórz nawias kwadratowy 0 kropka kropka m minus 1 zamknij nawias kwadratowy.
Linia 18. wiersz ← 1.
Linia 19. dol ← 1.
Linia 21. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek klucz minus 1 wykonuj dwukropek.
Linia 22. dla j znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek m minus 1 wykonuj dwukropek.
Linia 23. plotek otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy ← apostrof apostrof.
Linia 24. i ← 1.
Linia 26. dopóki i otwórz nawias ostrokątny znak równości m wykonuj dwukropek.
Linia 27. plotek otwórz nawias kwadratowy wiersz zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy ← jawny otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 28. i ← i plus 1.
Linia 30. jeżeli wiersz znak równości klucz dwukropek.
Linia 31. dol ← 0.
Linia 32. jeżeli wiersz znak równości 1 dwukropek.
Linia 33. dol ← 1.
Linia 34. jeżeli dol znak równości 1 dwukropek.
Linia 35. wiersz ← wiersz plus 1.
Linia 36. w przeciwnym razie dwukropek.
Linia 37. wiersz ← wiersz minus 1.
Linia 39. szyfrogram otwórz nawias kwadratowy 0 kropka kropka m minus 1 zamknij nawias kwadratowy.
Linia 40. b ← 1.
Linia 42. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek klucz minus 1 wykonuj dwukropek.
Linia 43. dla j znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek m minus 1 wykonuj dwukropek.
Linia 44. jeżeli plotek otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy ≠ apostrof apostrof dwukropek.
Linia 45. szyfrogram otwórz nawias kwadratowy b zamknij nawias kwadratowy ← plotek otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy.
Linia 46. b ← b plus 1.
Linia 48. zwróć szyfrogram otwórz nawias kwadratowy zamknij nawias kwadratowy.
Słownik
iteracja
iteracja
technika programowania, która polega na powtarzaniu tej samej operacji określoną liczbę razy lub do momentu, w którym zadany warunek zostanie spełniony
klucz
klucz
informacja, która jest wykorzystywana do szyfrowania i/lub deszyfrowania wiadomości
klucz prywatny
klucz prywatny
tajny klucz wykorzystywany w procesie deszyfrowania w szyfrach asymetrycznych; powinien być znany jedynie adresatowi zaszyfrowanej wiadomości
klucz publiczny
klucz publiczny
udostępniony publicznie klucz wykorzystywany w procesie szyfrowania w szyfrach asymetrycznych
kod ASCII
kod ASCII
-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
kryptografia
kryptografia
gałąź wiedzy o zapisywaniu informacji w sposób utrudniający, bądź całkowicie uniemożliwiający jej odczytanie