Prezentacja multimedialna
Zapoznaj się z prezentacją. Prześledź działanie programu.
Zapoznaj się z prezentacją, w tym z działaniem programu.
Szyfr płotkowy – rodzaj szyfru przestawieniowego
Szyfr płotkowy jest przykładem szyfru przestawieniowego – w zaszyfrowanej wiadomości obecne są wszystkie znaki użyte w tekście jawnym, zmieniona zostaje jedynie ich pozycja w szyfrogramie. Aby zaszyfrować wiadomość algorytmem szyfru płotkowego, na początku należy wybrać klucz symetryczny, który posłuży do zaszyfrowania i odszyfrowania wiadomości.
Sposób działania
W e‑materiale teoretycznym omówiliśmy algorytm szyfrowania płotkowego, w tej prezentacji przeanalizujemy jego implementację w języku Python. W przedstawionym programie zastosujemy funkcję przyjmującą dwa parametry: tekst_do_szyfrowania
oraz klucz
.
W przypadku tego algorytmu kluczem będzie wysokość płotka, czyli w podanym przykładzie: pięć.
Widzimy pełny kod źródłowy funkcji. Podzielony jest na cztery główne kroki, które za chwilę omówimy dokładniej. Zwróćmy uwagę na wiersze: 4., 9., 11., 22., 37., 41. i 48. – w nich zawarte są funkcje print
, dzięki którym możemy obserwować wyniki kolejnych działań algorytmu. W wierszach od 20. do 37. znajduje się główna część programu. Jest to pętla while
, czyli pętla warunkowa działająca dopóty, dopóki zmienna tekst_jawny
zawiera jakikolwiek znak. Na uwagę zasługują również wiersze od 43. do 50., w których realizujemy odczyt kolejnych znaków szyfrogramu i złożenie zaszyfrowanego komunikatu.
Kod
Krok 1. Usuń spacje i zmień wszystkie litery na wielkie
Rozpocznijmy analizę od efektu działania – widzimy napis FONTANNAWPARKU
, zapisany wielkimi literami i bez spacji. Podczas gdy funkcję szyfruj_plotkowy
wywołaliśmy, podając jako argument napis zawierający zarówno spacje, jak i małe litery. Zmiana ta została przeprowadzona w wierszu 3. kodu. Zastosowano tu metodę join
, używaną dla obiektów tekstowych – w omawianym przypadku obiekt reprezentują dwa cudzysłowy na lewo od kropki po lewej stronie metody. Jej argumentem jest wyrażenie listowe, generujące listę znaków zamienionych na wielkie litery metodą upper
na podstawie kolekcji wejściowej, czyli szyfrowanego ciągu znaków. Dzięki zastosowaniu klauzuli if
zamieniamy tylko te znaki, które nie są spacją.
Możemy to prześledzić na zrzucie ekranu z aplikacji IDLE
. Widzimy kilka poleceń. Pierwszym z nich jest zastosowanie metody join
– doklejamy w niej do pustego ciągu tekstowego kolejne elementy z listy.
Widzimy również generator listowy, który iteruje po kolejnych literach napisu. W ten sposób ciąg zamieniany jest na listę pojedynczych znaków. W kolejnym generatorze widzimy użycie metody upper
, przeprowadzającej zamianę małych liter na wielkie. Następny generator zawiera klauzulę if
, dzięki czemu na wynikowej liście znajdują się elementy spełniające określony w niej warunek. Ostatnie polecenie łączy metodę join
z generatorem listowym.
Efekt działania
Kod
Krok 2. Sprawdź i zapamiętaj liczbę znaków do szyfrowania
W kolejnej części funkcji tworzymy płotek, a więc listę dwuwymiarową, która zawiera tyle list o wielkości klucza, ile jest liter w szyfrowanym napisie.
Ponownie spójrzmy na zrzut ekranu z aplikacji IDLE. Widzimy kilka poleceń. Pierwszym z nich jest generator listowy. Ma on składnię analogiczną do pętli iteracyjnej for
. Pamiętajmy, że w przypadku generatora listowego nie korzystamy z metody append
dodającej nowe elementy do listy. Dodatkowo za słowem kluczowym for
występuje znak podkreślenia – w języku Python używamy go do oznaczenia niepotrzebnej zmiennej. W kolejnym poleceniu mamy ten sam generator listowy, lecz zamiast podkreślenia znajduje się tu zmienna x
, a wynik otrzymujemy identyczny. Wynika z tego, że zmienna ta nie wpływa na wynik. Widzimy również złożenie jednego generatora listowego w drugim, dzięki czemu tworzona jest lista dwuwymiarowa. Ostatnie wywołanie to standardowa pętla iteracyjna, w której wyświetlamy kolejne elementy listy dwuwymiarowej – są to po prostu listy.
Zwróć uwagę na to, że w przypadku programu generator listowy wypełnia listę nie literami x, a znakami spacji.
Kod
Efekt działania
Krok 3. Umieść tekst jawny w tablicy dwuwymiarowej
Pobieramy kolejne znaki z tekstu do zaszyfrowania (widoczne jest to w wierszu 8.) i zgodnie z zasadą płotka przypisujemy je do odpowiednich elementów listy dwuwymiarowej (wiersz 10.). Następnie w wierszach od 14. do 17. sprawdzamy, jak zmienić flagę kierunek
określającą, czy kolejna litera ma być poniżej czy powyżej poprzedniej. Warte uwagi rozwiązanie zastosowane jest w wierszu 23. Do zmiennej przypisujemy kolejną zmienną, lecz odwołujemy się do niej jak do listy, używając metody wycinków. Sposób działania tego mechanizmu widzimy na zrzucie z aplikacji IDLE: do zmiennej tekstowej przypisujemy wartość – słowo Adam
. Za pomocą funkcji id
sprawdzamy jej identyfikator, a następnie przypisujemy do niej wycinek wszystkich znaków: począwszy od indeksu 1 do końca. W ten sposób odcinamy pierwszy znak mający indeks 0. Widzimy nową wartość oraz identyfikator, który jest różny od poprzedniego. Python utworzył zupełnie nową zmienną, mającą jednak tę samą nazwę.
Kod
Litery zostały rozmieszczone na płotku. Zauważmy, że litera F umieszczona jest w pierwszym wierszu, a więc w pierwszej wewnętrznej liście w strukturze dwuwymiarowej listy. Następnie widzimy, w których miejscach w kolejnych listach są umieszczane inne litery. Flaga kierunek
zmienia swój znak w momencie, kiedy dochodzimy do końca list i płotek zawraca. Przeanalizuj kod programu i jego efekty.
Efekt działania
Krok 4. Odczytaj zaszyfrowaną wiadomość
Widzimy cały płotek i rozmieszczone w nim litery. Aby otrzymać ten efekt, stosujemy pętlę iteracyjną.
Kod
Efekt działania
Krok 5. Zbuduj zaszyfrowaną wiadomość i zwróć ją
Używamy kolejnych indeksów w zależności od klucza, a więc drugiego parametru funkcji. W ten sposób sprawdzamy we wszystkich listach wewnętrznych płotka, czy na kolejnej pozycji znajduje się znak inny niż spacja. Jeśli tak, wypisujemy ten znak na ekranie, stosując dodatkowy parametr funkcji print
o nazwie end
– przypisujemy mu znak dwukropka. Wówczas w pętli wszystkie znaki znajdujące się na danym indeksie będą wypisane w jednej linii. Dodatkowo dodajemy ten znak do zmiennej szyfrogram
, którą zwracamy za pomocą słowa kluczowego return
na końcu funkcji. W ten sposób uzyskujemy zaszyfrowany tekst. Na zrzucie ekranu z aplikacji IDLE znajduje się wywołanie pełnej funkcji z usuniętymi pewnymi funkcjami print
. Widzimy tu strukturę listy dwuwymiarowej i rozmieszczenie liter.
Kod
Efekt działania
Zaszyfruj metodą płotkową tekst Hic‑sunt‑leones
, używając klucza o wartości 3. Korzystaj z rozwiązania przedstawionego w prezentacji.
Specyfikacja problemu:
Dane:
slowo
– łańcuch znaków do zaszyfrowaniaklucz
– liczba naturalna; klucz szyfru
Wynik:
szyfr
– zaszyfrowany łańcuch znakówRBQgYZDRz6N6c