Szyfr Playfair
Szyfr Playfair to szyfr, w którym wiadomość zapisuje się parami liter. Do szyfrowania używa się specjalnej tabeli 5 × 5, tworzonej na podstawie wybranego hasła. Każda para liter jest następnie zamieniana według położenia liter w tabeli.
Jeżeli litery znajdują się w tym samym wierszu, przesuwamy je o jedno miejsce w prawo. Gdy są w tej samej kolumnie, przesuwamy je o jedno miejsce w dół. Jeśli tworzą rogi prostokąta, każdą literę zamieniamy na tę leżącą w tym samym wierszu, ale w przeciwległym rogu.

Program w Pythonie
W linijkach 1-14 znajduje się funkcja utworz_tabele, która przygotowuje tabelę 5 × 5 potrzebną do działania szyfru Playfair. W linijce 2 zapisany jest alfabet bez litery J. W tym szyfrze litery I i J zwykle traktuje się jako jedno pole, dlatego przed utworzeniem tabeli litera J jest zamieniana na I.
W linijce 3 program łączy hasło z całym alfabetem. Dla hasła KOD powstaje tekst zaczynający się od liter KOD, a dalej zawiera wszystkie litery alfabetu. W linijkach 4-8 program przechodzi przez ten tekst i zapisuje każdą literę tylko raz. Dzięki temu litery z hasła nie pojawiają się ponownie w dalszej części tabeli.
W linijkach 10-12 program dzieli gotowy ciąg 25 liter na pięć fragmentów po pięć znaków. Każdy fragment staje się jednym wierszem tabeli. W linijce 14 funkcja zwraca gotową tabelę Playfair.
Linijki 16-20 tworzą funkcję znajdz_pozycje. Jej zadaniem jest odnalezienie konkretnej litery w tabeli. Program sprawdza kolejno każdy wiersz i każdą kolumnę. Gdy znajdzie szukaną literę, zwraca numer jej wiersza i kolumny, na przykład dla litery T może zwrócić 3, 3.
W linijkach 22-61 znajduje się główna funkcja szyfr_playfair. Najpierw w linijce 23 powstaje tabela z wybranego hasła. W linijce 24 wiadomość zostaje zamieniona na wielkie litery, J zostaje zmienione na I, a spacje są usuwane. W linijce 25 tworzona jest pusta lista pary, do której będą trafiały kolejne dwuliterowe fragmenty wiadomości.
Linijki 27-37 przygotowują pary podczas szyfrowania. Program bierze pierwszą literę, a następnie sprawdza kolejną. Jeżeli wiadomość kończy się pojedynczą literą albo obie litery w parze są takie same, program dopisuje X jako drugą literę. Dzięki temu każda para zawsze ma dwie różne litery. Na przykład słowo BALLOON zostanie podzielone na pary BA, LX, LO, ON.
Podczas deszyfrowania nie trzeba już dzielić tekstu od nowa ani dodawać litery X. Dlatego w linijkach 38-40 program pobiera szyfrogram po dwie litery. W linijkach 42-45 ustalany jest kierunek przesunięcia: podczas szyfrowania wynosi on 1, a podczas deszyfrowania -1.
W linijkach 47-59 program przetwarza każdą parę osobno. Najpierw odnajduje pozycje obu liter w tabeli. Jeśli są w tym samym wierszu, linijki 51-53 przesuwają je o jedno pole w prawo przy szyfrowaniu albo w lewo przy deszyfrowaniu. Zapis % 5 sprawia, że po dojściu do końca wiersza program wraca na jego początek.
Jeżeli litery są w tej samej kolumnie, linijki 54-56 przesuwają je o jedno pole w dół albo w górę. Gdy litery znajdują się w różnych wierszach i kolumnach, tworzą rogi prostokąta. Wtedy linijki 57-59 wybierają litery z przeciwległych rogów, ale pozostające w tych samych wierszach.
W linijce 61 funkcja zwraca gotową zaszyfrowaną lub odszyfrowaną wiadomość. W linijkach 63-64 zapisujemy tekst TEST i hasło KOD. Linijki 66-67 szyfrują wiadomość, a wynik SGTU zostaje wyświetlony. W linijkach 69-70 program odszyfrowuje SGTU i ponownie otrzymuje słowo TEST.
def utworz_tabele(haslo):alfabet = "ABCDEFGHIKLMNOPQRSTUVWXYZ"wszystkie_litery = haslo.upper().replace("J", "I") + alfabetunikalne_litery = ""for litera in wszystkie_litery:if litera not in unikalne_litery:unikalne_litery = unikalne_litery + literatabela = []for i in range(0, len(unikalne_litery), 5):tabela.append(unikalne_litery[i:i + 5])return tabeladef znajdz_pozycje(tabela, litera):for wiersz in range(5):for kolumna in range(5):if tabela[wiersz][kolumna] == litera:return wiersz, kolumnadef szyfr_playfair(tekst, haslo, tryb):tabela = utworz_tabele(haslo)tekst = tekst.upper().replace("J", "I").replace(" ", "")pary = []if tryb == "szyfruj":i = 0while i < len(tekst):pierwsza = tekst[i]if i + 1 == len(tekst) or pierwsza == tekst[i + 1]:druga = "X"i = i + 1else:druga = tekst[i + 1]i = i + 2pary.append(pierwsza + druga)else:for i in range(0, len(tekst), 2):pary.append(tekst[i:i + 2])wynik = ""przesuniecie = 1if tryb == "deszyfruj":przesuniecie = -1for para in pary:wiersz1, kolumna1 = znajdz_pozycje(tabela, para[0])wiersz2, kolumna2 = znajdz_pozycje(tabela, para[1])if wiersz1 == wiersz2:wynik = wynik + tabela[wiersz1][(kolumna1 + przesuniecie) % 5]wynik = wynik + tabela[wiersz2][(kolumna2 + przesuniecie) % 5]elif kolumna1 == kolumna2:wynik = wynik + tabela[(wiersz1 + przesuniecie) % 5][kolumna1]wynik = wynik + tabela[(wiersz2 + przesuniecie) % 5][kolumna2]else:wynik = wynik + tabela[wiersz1][kolumna2]wynik = wynik + tabela[wiersz2][kolumna1]return wynikwiadomosc = "TEST"haslo = "KOD"zaszyfrowana = szyfr_playfair(wiadomosc, haslo, "szyfruj")print("Zaszyfrowana wiadomość:", zaszyfrowana)odszyfrowana = szyfr_playfair(zaszyfrowana, haslo, "deszyfruj")print("Odszyfrowana wiadomość:", odszyfrowana)