Szyfr Afiniczny

Szyfr afiniczny to szyfr, w którym każda litera zostaje zamieniona na inną według prostego wzoru matematycznego. Do działania potrzebuje dwóch liczb, oznaczanych zwykle jako a i b. Najpierw literze przypisuje się jej numer w alfabecie, następnie program mnoży go przez liczbę a, dodaje b i wraca do początku alfabetu, gdy wynik jest zbyt duży.

To bardziej rozbudowana wersja szyfru Cezara. Gdy liczba a wynosi 1, pozostaje zwykłe przesunięcie liter, czyli szyfr Cezara. Przy deszyfrowaniu wykonuje się działanie odwrotne, dlatego liczba a musi być dobrana odpowiednio, aby każdą zaszyfrowaną literę można było jednoznacznie odczytać.

Program w Pythonie

W linijkach 1-23 znajduje się funkcja szyfr_afiniczny. Otrzymuje ona tekst do przetworzenia, dwie liczby a i b oraz tryb działania: szyfruj albo deszyfruj.

W linijce 2 program zapisuje alfabet angielski. Każda litera ma swoje miejsce, zaczynając od zera: A ma numer 0, B ma 1, aż do Z, które ma 25. W linijce 3 tworzona jest pusta zmienna wynik, do której program będzie dodawał kolejne zaszyfrowane lub odszyfrowane znaki.

Linijki 5-9 wykonują się tylko podczas deszyfrowania. Program szuka liczby odwrotnej do a. W tym przykładzie a wynosi 7, a jej liczba odwrotna w alfabecie liczącym 26 liter to 15, ponieważ 7 × 15 = 105, a reszta z dzielenia 105 przez 26 wynosi 1. Ta liczba jest potrzebna, aby odwrócić działanie szyfrowania.

W linijce 11 pętla pobiera kolejno każdy znak wiadomości. Metoda upper() zamienia tekst na wielkie litery. W linijce 12 program sprawdza, czy aktualny znak jest literą z alfabetu. Jeśli tak, w linijce 13 odszukuje numer tej litery i zapisuje go w zmiennej miejsce.

W linijkach 15-16 wykonywane jest szyfrowanie. Program liczy nowe miejsce litery według wzoru a × miejsce + b. Na przykład dla litery T, która ma numer 19, używamy liczb a = 7 oraz b = 4: 7 × 19 + 4 = 137. Zapis % len(alfabet) pozwala wrócić na początek alfabetu, gdy wynik jest większy niż 25. 137 % 26 daje 7, więc litera T zostaje zamieniona na H.

Linijki 17-18 działają podczas deszyfrowania. Program korzysta wtedy z liczby odwrotnej do a i wzoru a_odwrotne × (miejsce - b). Dzięki temu może cofnąć wcześniejsze szyfrowanie i odzyskać pierwotną literę.

W linijce 20 program pobiera literę z obliczonego miejsca w alfabecie i dopisuje ją do zmiennej wynik. Jeżeli znak nie jest literą, na przykład jest spacją, przecinkiem lub cyfrą, linijka 22 dopisuje go bez zmian. W linijce 23 funkcja zwraca gotową wiadomość.

W linijce 25 zapisujemy wiadomość TEST. W linijkach 27-28 program szyfruje ją liczbami a = 7 i b = 4, zapisuje wynik w zmiennej zaszyfrowana i wyświetla go na ekranie. Wynikiem jest HGAH.

W linijkach 30-31 program wywołuje tę samą funkcję w trybie deszyfruj. Odszyfrowuje HGAH, zapisuje wynik w zmiennej odszyfrowana i wypisuje ponownie słowo TEST.

  1. def szyfr_afiniczny(tekst, a, b, tryb):
  2. alfabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  3. wynik = ""
  4. if tryb == "deszyfruj":
  5. a_odwrotne = 0
  6. for liczba in range(len(alfabet)):
  7. if (a * liczba) % len(alfabet) == 1:
  8. a_odwrotne = liczba
  9. for znak in tekst.upper():
  10. if znak in alfabet:
  11. miejsce = alfabet.index(znak)
  12. if tryb == "szyfruj":
  13. nowe_miejsce = (a * miejsce + b) % len(alfabet)
  14. else:
  15. nowe_miejsce = (a_odwrotne * (miejsce - b)) % len(alfabet)
  16. wynik = wynik + alfabet[nowe_miejsce]
  17. else:
  18. wynik = wynik + znak
  19. return wynik
  20. tajemna_wiadomosc = "TEST"
  21. zaszyfrowana = szyfr_afiniczny(tajemna_wiadomosc, 7, 4, "szyfruj")
  22. print("Zaszyfrowana wiadomość:", zaszyfrowana)
  23. odszyfrowana = szyfr_afiniczny(zaszyfrowana, 7, 4, "deszyfruj")
  24. print("Odszyfrowana wiadomość:", odszyfrowana)

Szyfr afiniczny – narzędzie

SzyfrujTryb
a = 7, b = 4Klucz
0Znaków w tekście

Wiadomość

0 znaków

Wynik

0 znaków

Przewijanie do góry