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

1 / 2Wybrana para
TETekst jawny
UESzyfrogram

Lewy górny

Alfabet

Prawy górny

Hasło: KOD

Lewy dolny

Hasło: ZAMEK

Prawy dolny

Alfabet
Litery odczytywane z tekstu Litery szyfrogramu

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

  1. def utworz_kwadrat(haslo):
  2. alfabet = "ABCDEFGHIKLMNOPQRSTUVWXYZ"
  3. litery = ""
  4. for litera in haslo.upper() + alfabet:
  5. if litera == "J":
  6. litera = "I"
  7. if litera in alfabet and litera not in litery:
  8. litery = litery + litera
  9. kwadrat = []
  10. for i in range(0, 25, 5):
  11. kwadrat.append(litery[i:i + 5])
  12. return kwadrat
  13. def znajdz_pozycje(kwadrat, litera):
  14. for wiersz in range(5):
  15. for kolumna in range(5):
  16. if kwadrat[wiersz][kolumna] == litera:
  17. return wiersz, kolumna
  18. def szyfr_cztery_kwadraty(tekst, haslo1, haslo2, tryb):
  19. alfabet = utworz_kwadrat("")
  20. prawy_gorny = utworz_kwadrat(haslo1)
  21. lewy_dolny = utworz_kwadrat(haslo2)
  22. tekst = tekst.upper().replace("J", "I").replace(" ", "")
  23. if len(tekst) % 2 == 1:
  24. tekst = tekst + "X"
  25. wynik = ""
  26. for i in range(0, len(tekst), 2):
  27. pierwsza = tekst[i]
  28. druga = tekst[i + 1]
  29. if tryb == "szyfruj":
  30. wiersz1, kolumna1 = znajdz_pozycje(alfabet, pierwsza)
  31. wiersz2, kolumna2 = znajdz_pozycje(alfabet, druga)
  32. wynik = wynik + prawy_gorny[wiersz1][kolumna2]
  33. wynik = wynik + lewy_dolny[wiersz2][kolumna1]
  34. else:
  35. wiersz1, kolumna1 = znajdz_pozycje(prawy_gorny, pierwsza)
  36. wiersz2, kolumna2 = znajdz_pozycje(lewy_dolny, druga)
  37. wynik = wynik + alfabet[wiersz1][kolumna2]
  38. wynik = wynik + alfabet[wiersz2][kolumna1]
  39. return wynik
  40. wiadomosc = "TEST"
  41. haslo1 = "KOD"
  42. haslo2 = "ZAMEK"
  43. zaszyfrowana = szyfr_cztery_kwadraty(wiadomosc, haslo1, haslo2, "szyfruj")
  44. print("Zaszyfrowana wiadomość:", zaszyfrowana)
  45. odszyfrowana = szyfr_cztery_kwadraty(zaszyfrowana, haslo1, haslo2, "deszyfruj")
  46. print("Odszyfrowana wiadomość:", odszyfrowana)

Szyfr Cztery kwadraty – narzędzie

SzyfrujTryb
2Pary liter
4Znaków w wyniku

Wiadomość

4 znaki

Wynik

4 znaki

Animacja działania

Podświetlona para pokazuje, jak powstają kolejne litery wyniku.

Odtwórz
Lewy górnyAlfabet
Prawy górnyHasło: KOD
Lewy dolnyHasło: ZAMEK
Prawy dolnyAlfabet
Para 1 z 2
Litery źródłowe T: lewy górny, E: prawy dolny
Pierwszy wynikWiersz T + kolumna E → U
Drugi wynikWiersz E + kolumna T → E
Wynik paryTE → UE
Litery pobrane z wiadomości Litery zapisane w wyniku

Przewijanie do góry