Spotkanie 24 – ostatnie…

Szyfry…

Komputery świetnie nadają się do wykorzystywania jako maszyny szyfrujące. Szyfrowanie wiadomości, jak wiemy, może być świetną zabawą, a czasami jest wręcz koniecznością (jak np. przy wrażliwych transakcjach bankowych).

Różnych rodzajów szyfrów jest bardzo dużo – my spróbujemy przedstawić kilka z nich i przy okazji spróbujemy zaprząc komputer (pisząc stosowny program), aby nam w tym pomógł.

GA-DE-RY-PO-LU-KI

Ten rodzaj szyfrowania zna każdy zuch! Wiadomość do zakodowania analizujemy litera po literze i gdy natrafimy na literkę pasującą do którejś pary hasła GA-DE-RY-PO-LU-KI, to zamieniamy ją na drugą literę z tej pary. Jeśli litera (znak) nie pojawia się w haśle, to nie zmieniamy jej. Przykładowo słowo: cukierek zaszyfrowane w ten sposób brzmi: clikdydi.

Ćwiczenie 1. Zakoduj opisaną metodą zdanie: Nikt prawie nie wie, dokąd go zaprowadzi droga, póki nie stanie u celu. Rozkoduj (zdeszyfruj) hasło: Ngjełlżdj tywg tg ypbptg, itóydj skę wcgud nkd zgczrng.

To jest dość wygodny sposób szyfrowania, a jego dodatkowymi dwiema zaletami są: 1. jeśli napiszemy program, który pozwoli nam łatwo kodować wiadomości (program szyfrujący), to jednocześnie otrzymamy program deszyfrujący do odczytywania zakodowanych przekazów (dlaczego?); 2. Możemy zmieniać klucz! Kluczem może być dowolne słowo (zdanie) o długości parzystej, w którym litery nie powtarzają się – np. SK-RZ-YŻ-OW-AN-IE. Dobrze w roli takich haseł spisują się tzw. panagramy – czyli zdania (wypowiedzi), w których każda litera alfabetu pojawia się dokładnie jeden raz – np. Pędź już i skleć z tych form główną baśń. Oczywiście takie hasło należy podzielić na 16 par sąsiadujących liter i pominąć wszystkie odstępy pomiędzy wyrazami.

Przykładowo, zaszyfrowana tym ostatnim kluczem pewna wiadomość, wygląda tak: Ókćtkysf ulky o mpsbhc hćgfóżlsb. Źebylłf ąbelit ul rtz hćpkyf. Spróbujcie ją odkodować.

Pomocny w wykonaniu powyższych ćwiczeń może być program napisany w Scratchu. Wykorzystuje on listę o nazwie KLUCZ do przechowywania ustalonego hasła kodującego (każda litera hasła jest osobnym elementem listy). Gdy podamy treść do zakodowania (lub zdekodowania), to program sprawdza całą tą treść znak po znaku i wyszukuje odpowiednią literę na liście – gdy ją znajduje, to zmienia ją zgodnie z regułami szyfrowania; jeśli nie – pozostawia bez zmian.

Gotowy szyfrator w Scratchu. Szyfrator (plik .sb3)Pobierz
KODY ASCII

W Pythonie lub C/C++ do tworzenia programów obsługujących szyfry możemy wykorzystać standardowy mechanizm w jaki komputery zapamiętują ciągi znaków. Niemal każdy znak/symbol dostępny z klawiatury komputera ma swój kod liczbowy – jest to tzw. kod ASCII (czyt. aski). Przykładowo wielka litera B ma swój kod ASCII równy 66, zaś znakowi tylda ~ odpowiada kod ASCII o wartości 126. Używając funkcji ord() lub chr() w Pythonie można łatwo sprawdzić jaki kod ASCII ma dany znak:

print(ord('B'))
print(ord('~'))
print(chr(176))

Tak naprawdę wspomniane kody ASCII to standard już nieco przestarzały i obecnie funkcjonują (działające na podobnej zasadzie) standardy, które obsługują znacznie więcej znaków. Zestaw ASCII ma ich tylko 128 (czyli poprawne wartości kodów do liczby od 0 do 127 włącznie). Jednak nazwa ASCII tak się zadomowiła w informatycznym żargonie, że do tej pory jest najczęściej używanym terminem w odniesieniu do kodowania znaków (choć często jest to nieścisłe określenie).

Takie naturalne przyporządkowanie znak-liczba daje wygodny sposób manipulacji i tworzenia szyfrów. Przykładowo tzw. szyfr Cezara polegający na przesunięciu zestawu liter alfabetu o stałą ustaloną wartość. Przykładowo (rozważamy alfabet łaciński bez polskich znaków charakterystycznych – tzw. diakrytycznych), jeżeli przesunięcie ma wynosić 3 znaki, to każdej literce A będzie odpowiadać literka D (A\to B\to C\to D), literce G odpowiadać będzie J (G\to H\to I\to J), zaś końcowe litery alfabetu przejdą na początkowe: znakowi Y będzie przyporządkowany znak B (Y\to Z\to A\to B). Każdorazowo dokonujemy przesunięcia o 3 litery.

Ćwiczenie 2. Zaszyfruj szyfrem Cezara z przesunięciem 10 (całego alfabetu języka polskiego) następującą wiadomość: Głupota jest początkiem mądrości.

Zadanie. Napisz w Pythonie program do kodowania wiadomości szyfrem Cezara. Na początek możesz wykorzystać wspomniane wyżej funkcje chr() i ord() i działać tylko na 26-literowym alfabecie łacińskim. Zakodowaną wiadomość (bez wartości przesunięcia) możesz pozostawić w komentarzu \ddot\smile

2 myśli w temacie “Spotkanie 24 – ostatnie…”

  1. Te zajęcia są bardzo fajne
    Tylko nie znam hasła do Zawodów : (KONKURS – ETAP II)
    Pewnie dla tego że nic nie wysłałem.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *