Szyfr Cztery Kwadraty
Szyfr Cztery kwadraty jest rozwinięciem szyfru Playfair. Wykorzystuje cztery tablice 5 × 5 ułożone w układzie dwóch górnych i dwóch dolnych kwadratów. Dwie tablice zawierają zwykły alfabet, a dwie pozostałe powstają na podstawie dwóch różnych haseł. Zwykle litery I i J umieszcza się w jednym polu.
Wiadomość dzieli się na pary liter. Pierwszą literę pary odnajduje się w lewym górnym kwadracie, a drugą w prawym dolnym. Następnie, korzystając z ich wierszy i kolumn, odczytuje się dwie nowe litery z pozostałych kwadratów. Deszyfrowanie wykonuje te same kroki w odwrotną stronę.
Szyfr Cztery kwadraty – interaktywny schemat
Lewy górny
AlfabetPrawy górny
Hasło: KODLewy dolny
Hasło: ZAMEKPrawy dolny
AlfabetProgram w Pythonie
W linijkach 1-15 znajduje się funkcja utworz_kwadrat. Jej zadaniem jest przygotowanie jednej tabeli 5 × 5. W linijce 2 zapisany jest alfabet używany przez szyfr Cztery kwadraty. Brakuje w nim litery J, ponieważ w tym szyfrze litery I i J traktowane są jako jedno pole.
W linijkach 5-9 program przechodzi po literach hasła, a następnie po całym alfabecie. Jeżeli napotka literę J, zamienia ją na I. Każda litera jest dopisywana do zmiennej litery tylko raz. Dzięki temu hasło znajduje się na początku tabeli, a później zostają dopisane pozostałe litery alfabetu.
W linijkach 11-13 program dzieli 25 zebranych liter na pięć fragmentów po pięć znaków. Z tych fragmentów powstaje tablica dwuwymiarowa, czyli kwadrat 5 × 5. Linijka 15 zwraca gotowy kwadrat.
Linijki 17-21 tworzą funkcję znajdz_pozycje. Program sprawdza kolejno każdy wiersz i każdą kolumnę tabeli. Gdy znajdzie podaną literę, zwraca jej pozycję: numer wiersza i numer kolumny. Ta informacja jest potrzebna do odczytywania liter z pozostałych kwadratów.
W linijkach 23-49 znajduje się główna funkcja szyfr_cztery_kwadraty. W linijce 24 tworzony jest zwykły kwadrat alfabetu. Linie 25-26 tworzą dwa kwadraty z haseł: haslo1 jest prawym górnym kwadratem, a haslo2 lewym dolnym.
W linijce 27 wiadomość jest zamieniana na wielkie litery, litera J zostaje zastąpiona przez I, a spacje są usuwane. W linijkach 29-30 program sprawdza, czy tekst ma parzystą liczbę znaków. Jeżeli nie, na końcu dopisuje literę X, aby ostatnia para również miała dwie litery.
W linijkach 34-47 program bierze wiadomość po dwie litery. Podczas szyfrowania pierwszej litery szuka w zwykłym lewym górnym kwadracie, a drugiej w zwykłym prawym dolnym kwadracie. Następnie linijka 41 odczytuje nową literę z prawego górnego kwadratu, używając wiersza pierwszej litery i kolumny drugiej. Linijka 42 odczytuje drugą nową literę z lewego dolnego kwadratu, używając wiersza drugiej litery i kolumny pierwszej.
Podczas deszyfrowania, w linijkach 43-47, program wykonuje działanie odwrotne. Pierwszej litery szuka w prawym górnym kwadracie, a drugiej w lewym dolnym. Potem odczytuje właściwe litery z kwadratów zawierających zwykły alfabet.
W linijce 49 funkcja zwraca gotowy wynik. W linijkach 51-53 zapisujemy wiadomość TEST oraz hasła KOD i ZAMEK. Linie 55-56 szyfrują wiadomość do postaci UETR, a linie 58-59 odszyfrowują ją z powrotem do słowa TEST.
def utworz_kwadrat(haslo):alfabet = "ABCDEFGHIKLMNOPQRSTUVWXYZ"litery = ""for litera in haslo.upper() + alfabet:if litera == "J":litera = "I"if litera in alfabet and litera not in litery:litery = litery + literakwadrat = []for i in range(0, 25, 5):kwadrat.append(litery[i:i + 5])return kwadratdef znajdz_pozycje(kwadrat, litera):for wiersz in range(5):for kolumna in range(5):if kwadrat[wiersz][kolumna] == litera:return wiersz, kolumnadef szyfr_cztery_kwadraty(tekst, haslo1, haslo2, tryb):alfabet = utworz_kwadrat("")prawy_gorny = utworz_kwadrat(haslo1)lewy_dolny = utworz_kwadrat(haslo2)tekst = tekst.upper().replace("J", "I").replace(" ", "")if len(tekst) % 2 == 1:tekst = tekst + "X"wynik = ""for i in range(0, len(tekst), 2):pierwsza = tekst[i]druga = tekst[i + 1]if tryb == "szyfruj":wiersz1, kolumna1 = znajdz_pozycje(alfabet, pierwsza)wiersz2, kolumna2 = znajdz_pozycje(alfabet, druga)wynik = wynik + prawy_gorny[wiersz1][kolumna2]wynik = wynik + lewy_dolny[wiersz2][kolumna1]else:wiersz1, kolumna1 = znajdz_pozycje(prawy_gorny, pierwsza)wiersz2, kolumna2 = znajdz_pozycje(lewy_dolny, druga)wynik = wynik + alfabet[wiersz1][kolumna2]wynik = wynik + alfabet[wiersz2][kolumna1]return wynikwiadomosc = "TEST"haslo1 = "KOD"haslo2 = "ZAMEK"zaszyfrowana = szyfr_cztery_kwadraty(wiadomosc, haslo1, haslo2, "szyfruj")print("Zaszyfrowana wiadomość:", zaszyfrowana)odszyfrowana = szyfr_cztery_kwadraty(zaszyfrowana, haslo1, haslo2, "deszyfruj")print("Odszyfrowana wiadomość:", odszyfrowana)
Szyfr Cztery kwadraty – narzędzie
Wiadomość
4 znakiWynik
4 znakiAnimacja działania
Podświetlona para pokazuje, jak powstają kolejne litery wyniku.