Szyfr Scytale

Szyfr Scytale to jeden z dawnych szyfrów przestawieniowych. Nie zamienia on liter na inne znaki, tylko zmienia ich kolejność. Do szyfrowania używano paska materiału lub skóry owiniętego wokół wałka o określonej grubości. Wiadomość zapisywano wzdłuż wałka, a po rozwinięciu paska litery tworzyły pozornie chaotyczny ciąg.

Aby odczytać wiadomość, trzeba było ponownie owinąć pasek wokół wałka o takiej samej grubości. Dopiero wtedy litery układały się w poprawny tekst. W wersji komputerowej podobny efekt można uzyskać, wpisując tekst do tabeli o ustalonej liczbie wierszy lub kolumn, a potem odczytując go w innym kierunku.

Interaktywny przykład

Szyfr Scytale

Grubość wałka
Rozkodowana wiadomość na wałku BARDZO TRUDNY SZYFR

Wałek z owiniętym paskiem

3 litery wokół wałka

Pasek po zdjęciu z wałka

Zakodowana wiadomość

Program w Pythonie

W linijkach 1-42 znajduje się funkcja szyfr_scytale. To najważniejsza część programu. Funkcja otrzymuje trzy informacje: tekst, który chcemy zaszyfrować lub odszyfrować, grubość wałka oraz tryb działania, czyli szyfruj albo deszyfruj.

W linijce 2 tekst zostaje zamieniony na wielkie litery, a następnie usuwane są z niego spacje. W klasycznym szyfrze Scytale wiadomość zapisywano na jednym długim pasku, dlatego najczęściej nie stosuje się w nim spacji. W linijce 3 program oblicza, ile kolumn będzie potrzebnych w tabeli. Zapis // oznacza dzielenie całkowite, czyli wynik bez części po przecinku. Dzięki dodaniu grubosc_walka - 1 program zaokrągla liczbę kolumn w górę, gdy nie da się podzielić liczby liter dokładnie przez grubość wałka.

W linijkach 4-10 tworzona jest tablica dwuwymiarowa. Jest to lista, która zawiera w sobie kolejne listy, czyli przypomina tabelę z wierszami i kolumnami. Liczba wierszy zależy od grubości wałka. Jeżeli wałek ma grubość 3, powstaną trzy wiersze. Każdy wiersz otrzymuje odpowiednią liczbę pustych pól, oznaczonych przez "". Taka tablica pozwala programowi ułożyć litery dokładnie tak, jak na pasku owiniętym wokół wałka.

W linijce 12 program sprawdza tryb działania. Jeżeli wpisano szyfruj, wykonywane są linijki 13-25. W linijce 13 powstaje zmienna indeks, która wskazuje, którą literę tekstu program ma właśnie wpisać do tabeli. Początkowo jej wartość wynosi 0, czyli wskazuje pierwszą literę.

W linijkach 15-19 program przechodzi kolejno przez wszystkie pola tabeli. Najpierw zmienia wiersz, a w każdym wierszu przechodzi przez kolejne kolumny. W linijce 17 sprawdza, czy w tekście pozostała jeszcze jakaś litera do wpisania. Jeśli tak, w linijce 18 wpisuje ją do aktualnego pola tabeli. W linijce 19 zwiększa indeks o 1, aby przy następnym polu pobrać kolejną literę wiadomości.

W linijkach 21-25 tworzony jest szyfrogram. Zmienna wynik jest na początku pusta. Tym razem program odczytuje tabelę inaczej: najpierw przechodzi przez kolumny, a dopiero potem przez wiersze. To właśnie zmiana kierunku odczytywania sprawia, że powstaje zaszyfrowana wiadomość. Tekst został wpisany do tabeli wierszami, ale jest odczytywany kolumnami.

Linijki 27-40 wykonują się podczas deszyfrowania. Ten fragment działa odwrotnie. W linijkach 30-34 program wpisuje zaszyfrowany tekst do tabeli kolumnami, ponieważ w taki sposób został on odczytany podczas szyfrowania. Warunek z linijki 32 jest potrzebny wtedy, gdy ostatni wiersz tabeli nie jest pełny. Dzięki niemu program nie próbuje wpisać litery do pola, które w oryginalnej wiadomości nie istniało.

W linijkach 36-40 program odczytuje tabelę wierszami. W ten sposób odzyskuje kolejność liter z wiadomości zapisanej wcześniej na wałku. W linijce 42 funkcja zwraca gotowy wynik: zaszyfrowaną albo odszyfrowaną wiadomość.

Po funkcji znajduje się właściwe użycie programu. W linijce 44 zapisana jest wiadomość BARDZO TRUDNY SZYFR. W linijkach 46-47 funkcja szyfruje tę wiadomość przy użyciu wałka o grubości 3, zapisuje wynik w zmiennej zaszyfrowana i wypisuje go na ekranie.

W linijkach 49-50 program ponownie wywołuje tę samą funkcję, ale tym razem z trybem deszyfruj. Zaszyfrowana wiadomość zostaje wpisana do tabeli kolumnami, odczytana wierszami i odzyskujemy pierwotny tekst.

  1. def szyfr_scytale(tekst, grubosc_walka, tryb):
  2. tekst = tekst.upper().replace(" ", "")
  3. kolumny = (len(tekst) + grubosc_walka - 1) // grubosc_walka
  4. tablica = []
  5. for wiersz in range(grubosc_walka):
  6. tablica.append([])
  7. for kolumna in range(kolumny):
  8. tablica[wiersz].append("")
  9. if tryb == "szyfruj":
  10. indeks = 0
  11. for wiersz in range(grubosc_walka):
  12. for kolumna in range(kolumny):
  13. if indeks < len(tekst):
  14. tablica[wiersz][kolumna] = tekst[indeks]
  15. indeks = indeks + 1
  16. wynik = ""
  17. for kolumna in range(kolumny):
  18. for wiersz in range(grubosc_walka):
  19. wynik = wynik + tablica[wiersz][kolumna]
  20. else:
  21. indeks = 0
  22. for kolumna in range(kolumny):
  23. for wiersz in range(grubosc_walka):
  24. if wiersz * kolumny + kolumna < len(tekst):
  25. tablica[wiersz][kolumna] = tekst[indeks]
  26. indeks = indeks + 1
  27. wynik = ""
  28. for wiersz in range(grubosc_walka):
  29. for kolumna in range(kolumny):
  30. wynik = wynik + tablica[wiersz][kolumna]
  31. return wynik
  32. tajemna_wiadomosc = "BARDZO TRUDNY SZYFR"
  33. zaszyfrowana = szyfr_scytale(tajemna_wiadomosc, 3, "szyfruj")
  34. print("Zaszyfrowana wiadomość:", zaszyfrowana)
  35. odszyfrowana = szyfr_scytale(zaszyfrowana, 3, "deszyfruj")
  36. print("Odszyfrowana wiadomość:", odszyfrowana)

Szyfr Scytale - narzędzie

Szyfruj Tryb
3 Grubość wałka
0 Kolumny

Wiadomość

0 znaków

Wynik

0 znaków

Układ liter na wałku

3 litery wokół wałka

Pasek po zdjęciu z wałka

Zakodowana wiadomość
Przewijanie do góry