Kryptografia

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 II 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
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

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
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

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

7-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

tablica ASCII
tablica ASCII

spis kodów znaków wykorzystywany w komputerach

szyfrogram
szyfrogram

zaszyfrowana wiadomość

szyfrowanie
szyfrowanie

przekształcanie tekstu jawnego w szyfrogram