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.
def szyfr_afiniczny(tekst, a, b, tryb):alfabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"wynik = ""if tryb == "deszyfruj":a_odwrotne = 0for liczba in range(len(alfabet)):if (a * liczba) % len(alfabet) == 1:a_odwrotne = liczbafor znak in tekst.upper():if znak in alfabet:miejsce = alfabet.index(znak)if tryb == "szyfruj":nowe_miejsce = (a * miejsce + b) % len(alfabet)else:nowe_miejsce = (a_odwrotne * (miejsce - b)) % len(alfabet)wynik = wynik + alfabet[nowe_miejsce]else:wynik = wynik + znakreturn wyniktajemna_wiadomosc = "TEST"zaszyfrowana = szyfr_afiniczny(tajemna_wiadomosc, 7, 4, "szyfruj")print("Zaszyfrowana wiadomość:", zaszyfrowana)odszyfrowana = szyfr_afiniczny(zaszyfrowana, 7, 4, "deszyfruj")print("Odszyfrowana wiadomość:", odszyfrowana)