PY_I_R_W14_M15 Wybrane algorytmy szyfrujące
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.

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.

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 jawnymtekst[0..n - 1]– przekazany do zaszyfrowania szyfrem płotkowym tekst jawny; tablica znaków zawierająca wielkie i małe litery alfabetu angielskiego oraz spacjeklucz– 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; gdziemjest równenminus liczba spacji w tekście jawnym
W wykonaniu opisanych w algorytmie operacji przydatne będzie operowanie na kodach 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.
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.
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.
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[][].
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.
Krok 5. Gotowa funkcja zapisana w pseudokodzie.
Słownik
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
informacja, która jest wykorzystywana do szyfrowania i/lub deszyfrowania wiadomości
tajny klucz wykorzystywany w procesie deszyfrowania w szyfrach asymetrycznych; powinien być znany jedynie adresatowi zaszyfrowanej wiadomości
udostępniony publicznie klucz wykorzystywany w procesie szyfrowania w szyfrach asymetrycznych
-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
gałąź wiedzy o zapisywaniu informacji w sposób utrudniający, bądź całkowicie uniemożliwiający jej odczytanie
spis kodów znaków wykorzystywany w komputerach
zaszyfrowana wiadomość
przekształcanie tekstu jawnego w szyfrogram