Tworzenie szyfrogramuszyfrogramszyfrogramu za pomocą szyfru Playfair polega na podzieleniu tekstu jawnego na grupy dwuznakowe, a następnie zastąpieniu par znaków/liter tekstu jawnego inną parą liter.

Do szyfrowania konieczna jest tabela tajnego słowa klucza – ma ona wymiary 5 x 5 i zawiera 25 liter alfabetu łacińskiego (alfabet łaciński ma 26 liter, więc opuszczamy jeden z rzadkich znaków – x lub q – lub traktujemy i oraz j jako jedną literę).

Oto przykładowa tabela sekretnego słowa klucza, utworzona ze słowa szyfrogram. Opuszczamy w kluczu wszystkie powtarzające się litery, a pozostałe pozycje w tabeli wypełniamy niewykorzystanymi literami alfabetu, zaczynając od litery a (uwaga: pomijamy literę q).

Przykład 1

Przykładowa tabela sekretnego słowa

s

z

y

f

r

o

g

a

m

b

c

d

e

h

i

j

k

l

n

p

t

u

v

w

x

Przyjrzyjmy się funkcji sekretna_tablica(), która będzie odpowiadać za stworzenie tabeli sekretnego słowa. W zmiennej alfabet znajduje się ciąg znaków, w którym przechowywane są litery alfabetu. Najpierw do tablicy wynikowej tablica wpisywane są po kolei unikalne znaki ze słowa klucz. Następnie wypełniamy tablicę kolejnymi znakami alfabetu, które nie występowały w słowie kluczowym.

Linia 1. def sekretna podkreślnik tablica otwórz nawias okrągły klucz dwukropek str zamknij nawias okrągły dwukropek. Linia 2. kratka dla tablicy 5 x 5 używamy alfabetu bez znaku cudzysłów Q cudzysłów. Linia 3. alfabet znak równości cudzysłów ABCDEFGHIJKLMNOPRSTUVWXYZ cudzysłów. Linia 4. tablica znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 6. kratka kopiujemy znaki przecinek ignorujemy duplikaty. Linia 7. for znak in klucz kropka upper otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 8. if znak not in tablica and znak in alfabet dwukropek. Linia 9. tablica kropka append otwórz nawias okrągły znak zamknij nawias okrągły. Linia 11. kratka wypełniamy pozostałe znaki w tablicy. Linia 13. for znak in alfabet dwukropek. Linia 14. if znak not in tablica dwukropek. Linia 15. tablica kropka append otwórz nawias okrągły znak zamknij nawias okrągły. Linia 16. return tablica.
Przykład 2

Przykład wywołania funkcji sekretna_tablica().

Linia 1. print otwórz nawias okrągły sekretna podkreślnik tablica otwórz nawias okrągły cudzysłów szyfrogram cudzysłów zamknij nawias okrągły zamknij nawias okrągły.

Wynik wywołania:

Linia 1. kratka otwórz nawias kwadratowy apostrof S apostrof przecinek apostrof Z apostrof przecinek apostrof Y apostrof przecinek apostrof F apostrof przecinek apostrof R apostrof przecinek apostrof O apostrof przecinek apostrof G apostrof przecinek apostrof A apostrof przecinek apostrof M apostrof przecinek apostrof B apostrof przecinek apostrof C apostrof przecinek apostrof D apostrof przecinek apostrof E apostrof przecinek apostrof H apostrof przecinek apostrof I apostrof przecinek apostrof J apostrof przecinek apostrof K apostrof przecinek apostrof L apostrof przecinek apostrof N apostrof przecinek apostrof P apostrof przecinek apostrof T apostrof przecinek apostrof U apostrof przecinek apostrof V apostrof przecinek apostrof W apostrof przecinek apostrof X apostrof zamknij nawias kwadratowy.

Otrzymany wynik możemy przekształcić tak, by odpowiadał zaprezentowanej przykładowej tabeli:

Linia 1. kratka otwórz nawias kwadratowy apostrof S apostrof przecinek apostrof Z apostrof przecinek apostrof Y apostrof przecinek apostrof F apostrof przecinek apostrof R apostrof przecinek. Linia 2. kratka apostrof O apostrof przecinek apostrof G apostrof przecinek apostrof A apostrof przecinek apostrof M apostrof przecinek apostrof B apostrof przecinek. Linia 3. kratka apostrof C apostrof przecinek apostrof D apostrof przecinek apostrof E apostrof przecinek apostrof H apostrof przecinek apostrof I apostrof przecinek. Linia 4. kratka apostrof J apostrof przecinek apostrof K apostrof przecinek apostrof L apostrof przecinek apostrof N apostrof przecinek apostrof P apostrof przecinek. Linia 5. kratka apostrof T apostrof przecinek apostrof U apostrof przecinek apostrof V apostrof przecinek apostrof W apostrof przecinek apostrof X apostrof zamknij nawias kwadratowy.

W kolejnym kroku dzielimy tekst jawny na części zawierające po dwie kolejne litery. Jeśli długość tekstu jawnego jest nieparzysta, dodajemy na końcu rzadki znak (np. X) po to, aby ostatnia część stanowiła parę znaków.

Możemy zdefiniować funkcję, która zrealizuje powyższe czynności i będzie zwracać kolejne części ciągu, tj. po dwa znaki na raz. Wykorzystamy do tego celu m.in.:

  • pętlę for ... in do generowania kolejnych indeksów elementów ciągu,

  • wyrażenie tekst_jawny[i:i+2] wykorzystujące notację indeksową do wyznaczania kolejnych dwuznakowych części ciągu,

  • wyrażenie yieldyieldyield, które będzie zwracać kolejne części, po jednej na raz.

Linia 1. def zwroc podkreślnik pary otwórz nawias okrągły tekst podkreślnik jawny dwukropek str zamknij nawias okrągły dwukropek. Linia 2. kratka sprawdzamy długość tekstu. Linia 3. if len otwórz nawias okrągły tekst podkreślnik jawny zamknij nawias okrągły procent 2 znak równości znak równości 1 dwukropek. Linia 4. tekst podkreślnik jawny plus znak równości cudzysłów x cudzysłów. Linia 5. tekst podkreślnik jawny znak równości tekst podkreślnik jawny kropka upper otwórz nawias okrągły zamknij nawias okrągły. Linia 7. for i in range otwórz nawias okrągły 0 przecinek len otwórz nawias okrągły tekst podkreślnik jawny zamknij nawias okrągły przecinek 2 zamknij nawias okrągły dwukropek. Linia 8. kratka zwracamy za pomocą yield kolejne pary znaków. Linia 9. yield tekst podkreślnik jawny otwórz nawias kwadratowy i dwukropek i plus 2 zamknij nawias kwadratowy.
Przykład 3

Przykład wywołania funkcji zwroc_pary().

Linia 1. kratka przykład użycia funkcji w pętli dwukropek. Linia 2. for para in zwroc podkreślnik pary otwórz nawias okrągły cudzysłów linuxtosystem cudzysłów zamknij nawias okrągły dwukropek. Linia 3. print otwórz nawias okrągły f cudzysłów kolejna para to dwukropek otwórz nawias klamrowy para zamknij nawias klamrowy cudzysłów zamknij nawias okrągły. Linia 5. kratka wyjście. Linia 6. kratka kolejna para to dwukropek otwórz nawias okrągły apostrof L apostrof przecinek apostrof I apostrof zamknij nawias okrągły. Linia 7. kratka kolejna para to dwukropek otwórz nawias okrągły apostrof N apostrof przecinek apostrof U apostrof zamknij nawias okrągły. Linia 8. kratka kolejna para to dwukropek otwórz nawias okrągły apostrof X apostrof przecinek apostrof T apostrof zamknij nawias okrągły. Linia 9. kratka kolejna para to dwukropek otwórz nawias okrągły apostrof O apostrof przecinek apostrof S apostrof zamknij nawias okrągły. Linia 10. kratka kolejna para to dwukropek otwórz nawias okrągły apostrof Y apostrof przecinek apostrof S apostrof zamknij nawias okrągły. Linia 11. kratka kolejna para to dwukropek otwórz nawias okrągły apostrof T apostrof przecinek apostrof E apostrof zamknij nawias okrągły. Linia 12. kratka kolejna para to dwukropek otwórz nawias okrągły apostrof M apostrof przecinek apostrof X apostrof zamknij nawias okrągły.

Zgodnie z algorytmem znajdujemy obie litery z każdej pary w tabeli i podmieniamy je na litery według różnych schematów w zależności od warunku:

  • Warunek 1: Obie litery znajdują się w tej samej kolumnie (np. sc) – wówczas szyfrowane litery zostają zastąpione literami znajdującymi się w tej samej kolumnie, poniżej jawnych; jeśli jawna jest ostatnia w danej kolumnie, wówczas  daną literę zastępujemy pierwszą literę z tej samej kolumny.

Przykład 4

Tekst jawny: "sc"

s -> o, c -> j

Tekst zakodowany: "oj"

RDLFQAp8p6xlI
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
  • Warunek 2: Obie litery znajdują się w tym samym wierszu (np. sy) – wówczas szyfrowane litery zostają zastąpione literami znajdującymi się w tym samym wierszu, na prawo od jawnych; jeśli jawna jest ostatnia w danym wierszu, wówczas bierzemy do szyfrogramu pierwszą literę z tego samego wiersza.

Przykład 5

Tekst jawny: "sy"

s -> z, y -> f

Tekst zakodowany: "zf"

R1JDmLtaP0XtG
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
  • Warunek 3: Obie litery znajdują się w innym wierszu i innej kolumnie (np. z i n).  Aby zaszyfrować daną literę, musimy znaleźć komórkę przecięcia wiersza, w którym znajduje się nasza szyfrowana litera oraz kolumnę, w której jest ulokowana druga litera.

Przykład 6

Tekst jawny: "zn"

z -> f, n -> k

Tekst zakodowany: "fk"

Rjw9S3ZC8Cnze
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Jak wynika z powyższych warunków, naszą sekretną tablicę, mimo że jest jednowymiarowa, musimy potraktować jako dwuwymiarową, aby określać położenie każdego znaku w wierszu i kolumnie.

Przykład 7

Na początku spróbujemy przedstawić jednowymiarową listę jako dwuwymiarową tablicę. W tym celu podzielimy listę na pięcioelementowe wiersze. Po wypisaniu pięciu elementów (znaków) w jednym wierszu użyjemy funkcji print
()
, by przejść do nowego wiersza. Następnie wypiszemy indeksy znaków rozpoczynających kolejne wiersze tabeli.

Linia 1. lista znak równości otwórz nawias kwadratowy apostrof S apostrof przecinek apostrof Z apostrof przecinek apostrof Y apostrof przecinek apostrof F apostrof przecinek apostrof R apostrof przecinek apostrof O apostrof przecinek apostrof G apostrof przecinek apostrof A apostrof przecinek apostrof M apostrof przecinek apostrof B apostrof przecinek apostrof C apostrof przecinek apostrof D apostrof przecinek apostrof E apostrof przecinek apostrof H apostrof przecinek apostrof I apostrof przecinek apostrof J apostrof przecinek apostrof K apostrof przecinek apostrof L apostrof przecinek apostrof N apostrof przecinek apostrof P apostrof przecinek apostrof T apostrof przecinek apostrof U apostrof przecinek apostrof V apostrof przecinek apostrof W apostrof przecinek apostrof X apostrof zamknij nawias kwadratowy. Linia 2. liczba podkreślnik kolumn znak równości 5. Linia 3. for i in range otwórz nawias okrągły len otwórz nawias okrągły lista zamknij nawias okrągły zamknij nawias okrągły dwukropek. Linia 4. if otwórz nawias okrągły i wykrzyknik znak równości 0 and divmod otwórz nawias okrągły i przecinek liczba podkreślnik kolumn zamknij nawias okrągły otwórz nawias kwadratowy 1 zamknij nawias kwadratowy znak równości znak równości 0 zamknij nawias okrągły dwukropek. Linia 5. print otwórz nawias okrągły i zamknij nawias okrągły. Linia 6. print otwórz nawias okrągły lista otwórz nawias kwadratowy i zamknij nawias kwadratowy przecinek end znak równości apostrof apostrof zamknij nawias okrągły. Linia 8. print otwórz nawias okrągły zamknij nawias okrągły. Linia 9. print otwórz nawias okrągły lista kropka index otwórz nawias okrągły apostrof S apostrof zamknij nawias okrągły zamknij nawias okrągły. Linia 10. print otwórz nawias okrągły lista kropka index otwórz nawias okrągły apostrof O apostrof zamknij nawias okrągły zamknij nawias okrągły. Linia 11. print otwórz nawias okrągły lista kropka index otwórz nawias okrągły apostrof C apostrof zamknij nawias okrągły zamknij nawias okrągły. Linia 12. print otwórz nawias okrągły lista kropka index otwórz nawias okrągły apostrof J apostrof zamknij nawias okrągły zamknij nawias okrągły. Linia 13. print otwórz nawias okrągły lista kropka index otwórz nawias okrągły apostrof T apostrof zamknij nawias okrągły zamknij nawias okrągły.

Po wykonaniu powyższego kodu (np. w trybie interaktywnym) otrzymamy następujący wynik:

Linia 1. S Z Y F R. Linia 2. O G A M B. Linia 3. C D E H I. Linia 4. J K L N P. Linia 5. T U V W X. Linia 8. 5. Linia 9. 10. Linia 10. 15. Linia 11. 20.

Użyta tu funkcja divmod()divmod(a, b)divmod() zwraca tuplę (krotkę) zawierającą wynik dzielenia całkowitego oraz resztę z dzielenia dwóch argumentów. Kod divmod(i, liczba_kolumn)[1] pozwala odczytać resztę z dzielenia indeksu kolejnego znaku oraz liczby kolumn. Jeżeli reszta jest równa zeru, oznacza to, że wydrukowaliśmy pięcioznakowy wiersz i należy przejść do nowego wiersza, aby drukować następny.

Dzięki metodzie index()index()index() jesteśmy w stanie ustalić pozycję podanego elementu (znaku) w liście. Jak widać początkowe indeksy znaków rozpoczynających kolejne wiersze są wielokrotnościami liczby kolumn.

Zastanówmy się teraz, w jaki sposób możemy określić położenie dowolnego znaku w wierszu i kolumnie, jeżeli znamy jego indeks w liście oraz przyjmujemy, że numery wierszy i kolumn zaczynają się od zera.

Przykład 8

W trybie interaktywnym wykonajmy podane polecenia:

Linia 1. lista znak równości otwórz nawias kwadratowy apostrof S apostrof przecinek apostrof Z apostrof przecinek apostrof Y apostrof przecinek apostrof F apostrof przecinek apostrof R apostrof przecinek apostrof O apostrof przecinek apostrof G apostrof przecinek apostrof A apostrof przecinek apostrof M apostrof przecinek apostrof B apostrof przecinek apostrof C apostrof przecinek apostrof D apostrof przecinek apostrof E apostrof przecinek apostrof H apostrof przecinek apostrof I apostrof przecinek apostrof J apostrof przecinek apostrof K apostrof przecinek apostrof L apostrof przecinek apostrof N apostrof przecinek apostrof P apostrof przecinek apostrof T apostrof przecinek apostrof U apostrof przecinek apostrof V apostrof przecinek apostrof W apostrof przecinek apostrof X apostrof zamknij nawias kwadratowy. Linia 2. liczba podkreślnik kolumn znak równości 5. Linia 3. znak podkreślnik 1 znak równości apostrof O apostrof. Linia 4. print otwórz nawias okrągły lista kropka index otwórz nawias okrągły znak podkreślnik 1 zamknij nawias okrągły zamknij nawias okrągły. Linia 5. print otwórz nawias okrągły divmod otwórz nawias okrągły lista kropka index otwórz nawias okrągły znak podkreślnik 1 zamknij nawias okrągły przecinek liczba podkreślnik kolumn zamknij nawias okrągły zamknij nawias okrągły. Linia 6. znak podkreślnik 2 znak równości apostrof G apostrof. Linia 7. print otwórz nawias okrągły lista kropka index otwórz nawias okrągły znak podkreślnik 2 zamknij nawias okrągły zamknij nawias okrągły. Linia 8. print otwórz nawias okrągły divmod otwórz nawias okrągły lista kropka index otwórz nawias okrągły znak podkreślnik 2 zamknij nawias okrągły przecinek liczba podkreślnik kolumn zamknij nawias okrągły zamknij nawias okrągły. Linia 9. znak podkreślnik 3 znak równości apostrof L apostrof. Linia 10. print otwórz nawias okrągły lista kropka index otwórz nawias okrągły znak podkreślnik 3 zamknij nawias okrągły zamknij nawias okrągły. Linia 11. print otwórz nawias okrągły divmod otwórz nawias okrągły lista kropka index otwórz nawias okrągły znak podkreślnik 3 zamknij nawias okrągły przecinek liczba podkreślnik kolumn zamknij nawias okrągły zamknij nawias okrągły.

Po wykonaniu powyższego kodu otrzymamy wynik:

Linia 1. 5. Linia 2. otwórz nawias okrągły 1 przecinek 0 zamknij nawias okrągły. Linia 3. 6. Linia 4. otwórz nawias okrągły 1 przecinek 1 zamknij nawias okrągły. Linia 5. 17. Linia 6. otwórz nawias okrągły 3 przecinek 2 zamknij nawias okrągły.

W podanym przykładzie znak 'O' ma indeks 5, który podzielony przez liczbę kolumn daje wynik całkowity 1 i resztę 0 – co oznacza, że znak 'O' znajduje się w wierszu 1 i kolumnie 0. Analogiczne operacje na dwóch kolejnych znakach pozwalają ustalić, że 'G' znajduje się w wierszu 1 i kolumnie 1, a 'L' w wierszu 3 i kolumnie 2.

Teraz możemy przygotować kod generujący zaszyfrowane znaki, tzn. funkcję szyfrującą, która:

  • otrzyma sekretną tablicę jako listę oraz parę znaków w tupli,

  • ustali położenie przekazanych znaków w wierszach i kolumnach sekretnej tabeli,

  • na podstawie omówionych warunków zastąpi je odpowiednimi znakami,

  • zwróci zaszyfrowany ciąg (parę znaków) zapisany w zmiennej tekst.

W funkcji zostanie wykorzystany mechanizm rozpakowywania tupli, polegający na przypisywaniu wartości elementów tupli do pojedynczych zmiennych, np.: znak_1, znak_2 = para_znakow lub wiersz_1, kolumna_1 = divmod(tablica.index(znak_1), 5).

Dla uproszczenia kodu liczbę kolumn zakodujemy za pomocą konkretnej wartości, czyli liczby 5.

Linia 1. def znajdz podkreślnik szyfr podkreślnik pary otwórz nawias okrągły tablica dwukropek list przecinek para podkreślnik znakow dwukropek tuple zamknij nawias okrągły dwukropek. Linia 2. znak podkreślnik 1 przecinek znak podkreślnik 2 znak równości para podkreślnik znakow. Linia 3. wiersz podkreślnik 1 przecinek kolumna podkreślnik 1 znak równości divmod otwórz nawias okrągły tablica kropka index otwórz nawias okrągły znak podkreślnik 1 zamknij nawias okrągły przecinek 5 zamknij nawias okrągły. Linia 4. wiersz podkreślnik 2 przecinek kolumna podkreślnik 2 znak równości divmod otwórz nawias okrągły tablica kropka index otwórz nawias okrągły znak podkreślnik 2 zamknij nawias okrągły przecinek 5 zamknij nawias okrągły. Linia 6. if wiersz podkreślnik 1 znak równości znak równości wiersz podkreślnik 2 dwukropek. Linia 7. tekst znak równości tablica otwórz nawias kwadratowy wiersz podkreślnik 1 asterysk 5 plus otwórz nawias okrągły kolumna podkreślnik 1 plus 1 zamknij nawias okrągły procent 5 zamknij nawias kwadratowy. Linia 8. tekst plus znak równości tablica otwórz nawias kwadratowy wiersz podkreślnik 2 asterysk 5 plus otwórz nawias okrągły kolumna podkreślnik 2 plus 1 zamknij nawias okrągły procent 5 zamknij nawias kwadratowy. Linia 9. elif kolumna podkreślnik 1 znak równości znak równości kolumna podkreślnik 2 dwukropek. Linia 10. tekst znak równości tablica otwórz nawias kwadratowy otwórz nawias okrągły otwórz nawias okrągły wiersz podkreślnik 1 plus 1 zamknij nawias okrągły procent 5 zamknij nawias okrągły asterysk 5 plus kolumna podkreślnik 1 zamknij nawias kwadratowy. Linia 11. tekst plus znak równości tablica otwórz nawias kwadratowy otwórz nawias okrągły otwórz nawias okrągły wiersz podkreślnik 2 plus 1 zamknij nawias okrągły procent 5 zamknij nawias okrągły asterysk 5 plus kolumna podkreślnik 2 zamknij nawias kwadratowy. Linia 12. else dwukropek. Linia 13. tekst znak równości tablica otwórz nawias kwadratowy wiersz podkreślnik 1 asterysk 5 plus kolumna podkreślnik 2 zamknij nawias kwadratowy. Linia 14. tekst plus znak równości tablica otwórz nawias kwadratowy wiersz podkreślnik 2 asterysk 5 plus kolumna podkreślnik 1 zamknij nawias kwadratowy. Linia 15. return tekst.
Przykład 9

Przykład wywołania funkcji znajdz_szyfr_pary():

Linia 1. kratka przykład wykonania dla zdefiniowanej tablicy. Linia 2. t znak równości sekretna podkreślnik tablica otwórz nawias okrągły cudzysłów szyfrogram cudzysłów zamknij nawias okrągły. Linia 3. print otwórz nawias okrągły znajdz podkreślnik szyfr podkreślnik pary otwórz nawias okrągły t przecinek otwórz nawias okrągły cudzysłów L cudzysłów przecinek cudzysłów I cudzysłów zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły. Linia 4. kratka wyjście. Linia 5. kratka PE. Linia 6. print otwórz nawias okrągły znajdz podkreślnik szyfr podkreślnik pary otwórz nawias okrągły t przecinek otwórz nawias okrągły cudzysłów N cudzysłów przecinek cudzysłów U cudzysłów zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły. Linia 7. kratka wyjście. Linia 8. kratka KW. Linia 9. print otwórz nawias okrągły znajdz podkreślnik szyfr podkreślnik pary otwórz nawias okrągły t przecinek otwórz nawias okrągły cudzysłów X cudzysłów przecinek cudzysłów T cudzysłów zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły. Linia 10. kratka wyjście. Linia 11. kratka TU.
RQMiVLDx5Rzvn
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Możemy zauważyć, że w przypadku litery X zaszyfrowanym znakiem jest T.

Podobnie możemy zaprojektować funkcję odszyfrowującą, która będzie oparta na tabeli znaków.

Ponownie odczytujemy pozycję znaków w tablicy za pomocą funkcji index()index()index() oraz divmod()divmod(a, b)divmod(). Następnie odszyfrowujemy znaki.

Linia 1. def odszyfruj podkreślnik pare otwórz nawias okrągły tablica dwukropek list przecinek para podkreślnik znakow dwukropek tuple zamknij nawias okrągły dwukropek. Linia 2. znak podkreślnik 1 przecinek znak podkreślnik 2 znak równości para podkreślnik znakow. Linia 3. wiersz podkreślnik 1 przecinek kolumna podkreślnik 1 znak równości divmod otwórz nawias okrągły tablica kropka index otwórz nawias okrągły znak podkreślnik 1 zamknij nawias okrągły przecinek 5 zamknij nawias okrągły. Linia 4. wiersz podkreślnik 2 przecinek kolumna podkreślnik 2 znak równości divmod otwórz nawias okrągły tablica kropka index otwórz nawias okrągły znak podkreślnik 2 zamknij nawias okrągły przecinek 5 zamknij nawias okrągły. Linia 6. if wiersz podkreślnik 1 znak równości znak równości wiersz podkreślnik 2 dwukropek. Linia 7. tekst znak równości tablica otwórz nawias kwadratowy wiersz podkreślnik 1 asterysk 5 plus otwórz nawias okrągły kolumna podkreślnik 1 minus 1 zamknij nawias okrągły procent 5 zamknij nawias kwadratowy. Linia 8. tekst plus znak równości tablica otwórz nawias kwadratowy wiersz podkreślnik 2 asterysk 5 plus otwórz nawias okrągły kolumna podkreślnik 2 minus 1 zamknij nawias okrągły procent 5 zamknij nawias kwadratowy. Linia 9. elif kolumna podkreślnik 1 znak równości znak równości kolumna podkreślnik 2 dwukropek. Linia 10. tekst znak równości tablica otwórz nawias kwadratowy otwórz nawias okrągły otwórz nawias okrągły wiersz podkreślnik 1 minus 1 zamknij nawias okrągły procent 5 zamknij nawias okrągły asterysk 5 plus kolumna podkreślnik 1 zamknij nawias kwadratowy. Linia 11. tekst plus znak równości tablica otwórz nawias kwadratowy otwórz nawias okrągły otwórz nawias okrągły wiersz podkreślnik 2 minus 1 zamknij nawias okrągły procent 5 zamknij nawias okrągły asterysk 5 plus kolumna podkreślnik 2 zamknij nawias kwadratowy. Linia 12. else dwukropek. Linia 13. tekst znak równości tablica otwórz nawias kwadratowy wiersz podkreślnik 1 asterysk 5 plus kolumna podkreślnik 2 zamknij nawias kwadratowy. Linia 14. tekst plus znak równości tablica otwórz nawias kwadratowy wiersz podkreślnik 2 asterysk 5 plus kolumna podkreślnik 1 zamknij nawias kwadratowy. Linia 15. return tekst.
Przykład 10

Przykład wywołania funkcji odszyfruj_pare():

Linia 1. t znak równości sekretna podkreślnik tablica otwórz nawias okrągły cudzysłów szyfrogram cudzysłów zamknij nawias okrągły. Linia 2. print otwórz nawias okrągły odszyfruj podkreślnik pare otwórz nawias okrągły t przecinek otwórz nawias okrągły cudzysłów P cudzysłów przecinek cudzysłów E cudzysłów zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły. Linia 3. kratka wyjście. Linia 4. kratka LI. Linia 5. print otwórz nawias okrągły odszyfruj podkreślnik pare otwórz nawias okrągły t przecinek otwórz nawias okrągły cudzysłów K cudzysłów przecinek cudzysłów W cudzysłów zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły. Linia 6. kratka wyjście. Linia 7. kratka NU. Linia 8. print otwórz nawias okrągły odszyfruj podkreślnik pare otwórz nawias okrągły t przecinek otwórz nawias okrągły cudzysłów T cudzysłów przecinek cudzysłów U cudzysłów zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły. Linia 9. kratka wyjście. Linia 10. kratka XT.

Możemy zauważyć, że funkcja działa poprawnie także dla znaków brzegowych, jak na przykład znak T.

Mając powyższe elementy, możemy zapisać funkcję szyfrującą oraz odszyfrowującą. Musimy pamiętać, aby tekst do zaszyfrowania podać w postaci znaków występujących w tablicy szyfrującej.

Linia 1. def szyfruj podkreślnik playfair otwórz nawias okrągły tekst podkreślnik jawny dwukropek str przecinek klucz dwukropek str zamknij nawias okrągły dwukropek. Linia 2. kratka tworzymy tablicę szyfrowania. Linia 3. tablica znak równości sekretna podkreślnik tablica otwórz nawias okrągły klucz zamknij nawias okrągły. Linia 4. kratka przetwarzamy tekst jawny na szyfrogram. Linia 5. szyfrogram znak równości cudzysłów cudzysłów. Linia 6. for para in zwroc podkreślnik pary otwórz nawias okrągły tekst podkreślnik jawny zamknij nawias okrągły dwukropek. Linia 7. szyfrogram plus znak równości znajdz podkreślnik szyfr podkreślnik pary otwórz nawias okrągły tablica przecinek para zamknij nawias okrągły. Linia 8. kratka zwracamy szyfrogram. Linia 9. return szyfrogram.
Przykład 11
Linia 1. kratka przykład wywołania. Linia 2. szyfrogram znak równości szyfruj podkreślnik playfair otwórz nawias okrągły cudzysłów Linuxtosystemoperacyjny cudzysłów przecinek cudzysłów kluczszyfru cudzysłów zamknij nawias okrągły. Linia 3. print otwórz nawias okrągły szyfrogram zamknij nawias okrągły. Linia 5. kratka wyjście dwukropek. Linia 6. kratka KJMCPVIAFYVDNIVBASLRMOAT.

Ponieważ proces szyfrowania dodał jeden znak na końcu naszego napisu, ostatni znak odszyfrowanej wiadomości będzie nadmiarowy. Funkcja deszyfrująca:

Linia 1. def odszyfruj podkreślnik playfair otwórz nawias okrągły szyfrogram dwukropek str przecinek klucz dwukropek str zamknij nawias okrągły dwukropek. Linia 2. kratka tworzymy tablicę szyfrowania. Linia 3. tablica znak równości sekretna podkreślnik tablica otwórz nawias okrągły klucz zamknij nawias okrągły. Linia 4. kratka przetwarzamy szyfrogram na tekst podkreślnik jawny. Linia 5. tekst podkreślnik jawny znak równości cudzysłów cudzysłów. Linia 6. for para in zwroc podkreślnik pary otwórz nawias okrągły szyfrogram zamknij nawias okrągły dwukropek. Linia 7. tekst podkreślnik jawny plus znak równości odszyfruj podkreślnik pare otwórz nawias okrągły tablica przecinek para zamknij nawias okrągły. Linia 8. kratka zwracamy tekst jawny. Linia 9. return tekst podkreślnik jawny.
Przykład 12

Przyład wywołania funkcji odszyfruj_playfair():

Linia 1. kratka przykład wywołania. Linia 2. tekst podkreślnik jawny znak równości odszyfruj podkreślnik playfair otwórz nawias okrągły cudzysłów KJMCPVIAFYVDNIVBASLRMOAT cudzysłów przecinek cudzysłów kluczszyfru cudzysłów zamknij nawias okrągły. Linia 3. print otwórz nawias okrągły tekst podkreślnik jawny zamknij nawias okrągły. Linia 5. kratka wyjście dwukropek. Linia 6. kratka LINUXTOSYSTEMOPERACYJNYX.

Cały kod programu w języku Python wygląda następująco:

Linia 1. def sekretna podkreślnik tablica otwórz nawias okrągły klucz dwukropek str zamknij nawias okrągły dwukropek. Linia 2. kratka dla tablicy 5 x 5 używamy alfabetu bez zanku cudzysłów Q cudzysłów. Linia 3. alphabet znak równości cudzysłów ABCDEFGHIJKLMNOPRSTUVWXYZ cudzysłów. Linia 4. tablica znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 6. kratka kopiujemy znaki przecinek ignorujemy duplikaty. Linia 7. for znak in klucz kropka upper otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 8. if znak not in tablica and znak in alphabet dwukropek. Linia 9. tablica kropka append otwórz nawias okrągły znak zamknij nawias okrągły. Linia 11. kratka wypełniamy pozostałe znaki w tablicy. Linia 13. for znak in alphabet dwukropek. Linia 14. if znak not in tablica dwukropek. Linia 15. tablica kropka append otwórz nawias okrągły znak zamknij nawias okrągły. Linia 16. return tablica. Linia 18. def zwroc podkreślnik pary otwórz nawias okrągły tekst podkreślnik jawny dwukropek str zamknij nawias okrągły dwukropek. Linia 19. kratka sprawdzamy długość tekstu. Linia 20. if len otwórz nawias okrągły tekst podkreślnik jawny zamknij nawias okrągły procent 2 znak równości znak równości 1 dwukropek. Linia 21. tekst podkreślnik jawny plus znak równości cudzysłów x cudzysłów. Linia 22. tekst podkreślnik jawny znak równości tekst podkreślnik jawny kropka upper otwórz nawias okrągły zamknij nawias okrągły. Linia 24. for i in range otwórz nawias okrągły 0 przecinek len otwórz nawias okrągły tekst podkreślnik jawny zamknij nawias okrągły przecinek 2 zamknij nawias okrągły dwukropek. Linia 25. kratka zwracamy za pomocą yield kolejne pary znaków. Linia 26. yield tekst podkreślnik jawny otwórz nawias kwadratowy i dwukropek i plus 2 zamknij nawias kwadratowy. Linia 28. def znajdz podkreślnik szyfr podkreślnik pary otwórz nawias okrągły tablica dwukropek list przecinek para podkreślnik znakow dwukropek tuple zamknij nawias okrągły dwukropek. Linia 29. znak podkreślnik 1 przecinek znak podkreślnik 2 znak równości para podkreślnik znakow. Linia 30. wiersz podkreślnik 1 przecinek kolumna podkreślnik 1 znak równości divmod otwórz nawias okrągły tablica kropka index otwórz nawias okrągły znak podkreślnik 1 zamknij nawias okrągły przecinek 5 zamknij nawias okrągły. Linia 31. wiersz podkreślnik 2 przecinek kolumna podkreślnik 2 znak równości divmod otwórz nawias okrągły tablica kropka index otwórz nawias okrągły znak podkreślnik 2 zamknij nawias okrągły przecinek 5 zamknij nawias okrągły. Linia 33. if wiersz podkreślnik 1 znak równości znak równości wiersz podkreślnik 2 dwukropek. Linia 34. tekst znak równości tablica otwórz nawias kwadratowy wiersz podkreślnik 1 asterysk 5 plus otwórz nawias okrągły kolumna podkreślnik 1 plus 1 zamknij nawias okrągły procent 5 zamknij nawias kwadratowy. Linia 35. tekst plus znak równości tablica otwórz nawias kwadratowy wiersz podkreślnik 2 asterysk 5 plus otwórz nawias okrągły kolumna podkreślnik 2 plus 1 zamknij nawias okrągły procent 5 zamknij nawias kwadratowy. Linia 36. elif kolumna podkreślnik 1 znak równości znak równości kolumna podkreślnik 2 dwukropek. Linia 37. tekst znak równości tablica otwórz nawias kwadratowy otwórz nawias okrągły otwórz nawias okrągły wiersz podkreślnik 1 plus 1 zamknij nawias okrągły procent 5 zamknij nawias okrągły asterysk 5 plus kolumna podkreślnik 1 zamknij nawias kwadratowy. Linia 38. tekst plus znak równości tablica otwórz nawias kwadratowy otwórz nawias okrągły otwórz nawias okrągły wiersz podkreślnik 2 plus 1 zamknij nawias okrągły procent 5 zamknij nawias okrągły asterysk 5 plus kolumna podkreślnik 2 zamknij nawias kwadratowy. Linia 39. else dwukropek. Linia 40. tekst znak równości tablica otwórz nawias kwadratowy wiersz podkreślnik 1 asterysk 5 plus kolumna podkreślnik 2 zamknij nawias kwadratowy. Linia 41. tekst plus znak równości tablica otwórz nawias kwadratowy wiersz podkreślnik 2 asterysk 5 plus kolumna podkreślnik 1 zamknij nawias kwadratowy. Linia 42. return tekst. Linia 44. def odszyfruj podkreślnik pare otwórz nawias okrągły tablica dwukropek list przecinek para podkreślnik znakow dwukropek tuple zamknij nawias okrągły dwukropek. Linia 45. znak podkreślnik 1 przecinek znak podkreślnik 2 znak równości para podkreślnik znakow. Linia 46. wiersz podkreślnik 1 przecinek kolumna podkreślnik 1 znak równości divmod otwórz nawias okrągły tablica kropka index otwórz nawias okrągły znak podkreślnik 1 zamknij nawias okrągły przecinek 5 zamknij nawias okrągły. Linia 47. wiersz podkreślnik 2 przecinek kolumna podkreślnik 2 znak równości divmod otwórz nawias okrągły tablica kropka index otwórz nawias okrągły znak podkreślnik 2 zamknij nawias okrągły przecinek 5 zamknij nawias okrągły. Linia 49. if wiersz podkreślnik 1 znak równości znak równości wiersz podkreślnik 2 dwukropek. Linia 50. tekst znak równości tablica otwórz nawias kwadratowy wiersz podkreślnik 1 asterysk 5 plus otwórz nawias okrągły kolumna podkreślnik 1 minus 1 zamknij nawias okrągły procent 5 zamknij nawias kwadratowy. Linia 51. tekst plus znak równości tablica otwórz nawias kwadratowy wiersz podkreślnik 2 asterysk 5 plus otwórz nawias okrągły kolumna podkreślnik 2 minus 1 zamknij nawias okrągły procent 5 zamknij nawias kwadratowy. Linia 52. elif kolumna podkreślnik 1 znak równości znak równości kolumna podkreślnik 2 dwukropek. Linia 53. tekst znak równości tablica otwórz nawias kwadratowy otwórz nawias okrągły otwórz nawias okrągły wiersz podkreślnik 1 minus 1 zamknij nawias okrągły procent 5 zamknij nawias okrągły asterysk 5 plus kolumna podkreślnik 1 zamknij nawias kwadratowy. Linia 54. tekst plus znak równości tablica otwórz nawias kwadratowy otwórz nawias okrągły otwórz nawias okrągły wiersz podkreślnik 2 minus 1 zamknij nawias okrągły procent 5 zamknij nawias okrągły asterysk 5 plus kolumna podkreślnik 2 zamknij nawias kwadratowy. Linia 55. else dwukropek. Linia 56. tekst znak równości tablica otwórz nawias kwadratowy wiersz podkreślnik 1 asterysk 5 plus kolumna podkreślnik 2 zamknij nawias kwadratowy. Linia 57. tekst plus znak równości tablica otwórz nawias kwadratowy wiersz podkreślnik 2 asterysk 5 plus kolumna podkreślnik 1 zamknij nawias kwadratowy. Linia 58. return tekst. Linia 60. def szyfruj podkreślnik playfair otwórz nawias okrągły tekst podkreślnik jawny dwukropek str przecinek klucz dwukropek str zamknij nawias okrągły dwukropek. Linia 61. tablica znak równości sekretna podkreślnik tablica otwórz nawias okrągły klucz zamknij nawias okrągły. Linia 62. szyfrogram znak równości cudzysłów cudzysłów. Linia 63. for para in zwroc podkreślnik pary otwórz nawias okrągły tekst podkreślnik jawny zamknij nawias okrągły dwukropek. Linia 64. szyfrogram plus znak równości znajdz podkreślnik szyfr podkreślnik pary otwórz nawias okrągły tablica przecinek para zamknij nawias okrągły. Linia 65. return szyfrogram. Linia 67. def odszyfruj podkreślnik playfair otwórz nawias okrągły szyfrogram dwukropek str przecinek klucz dwukropek str zamknij nawias okrągły dwukropek. Linia 68. tablica znak równości sekretna podkreślnik tablica otwórz nawias okrągły klucz zamknij nawias okrągły. Linia 69. tekst podkreślnik jawny znak równości cudzysłów cudzysłów. Linia 70. for para in zwroc podkreślnik pary otwórz nawias okrągły szyfrogram zamknij nawias okrągły dwukropek. Linia 71. tekst podkreślnik jawny plus znak równości odszyfruj podkreślnik pare otwórz nawias okrągły tablica przecinek para zamknij nawias okrągły. Linia 72. return tekst podkreślnik jawny. Linia 74. kratka przykład wywołania. Linia 75. tekst podkreślnik jawny znak równości odszyfruj podkreślnik playfair otwórz nawias okrągły cudzysłów KJMCPVIAFYVDNIVBASLRMOAT cudzysłów przecinek cudzysłów kluczszyfru cudzysłów zamknij nawias okrągły. Linia 76. print otwórz nawias okrągły tekst podkreślnik jawny zamknij nawias okrągły.
Dla zainteresowanych

Możemy przygotować program z graficznym interfejsemgraficzny interfejsgraficznym interfejsem dla szyfrowania lub odszyfrowywania. Użyjemy do tego celu biblioteki PySimpleGuiPySimpleGUIPySimpleGui.

Linia 1. def gui podkreślnik szyfrowanie podkreślnik playfair otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 2. import PySimpleGUI as sg. Linia 3. uklad znak równości otwórz nawias kwadratowy otwórz nawias kwadratowy sg kropka Text otwórz nawias okrągły cudzysłów Podaj tekst jawny lub szyfrogram otwórz nawias okrągły max kropka 35 znaków zamknij nawias okrągły cudzysłów zamknij nawias okrągły zamknij nawias kwadratowy przecinek. Linia 4. otwórz nawias kwadratowy sg kropka Input otwórz nawias okrągły key znak równości cudzysłów dane cudzysłów zamknij nawias okrągły zamknij nawias kwadratowy przecinek. Linia 5. otwórz nawias kwadratowy sg kropka Text otwórz nawias okrągły cudzysłów Podaj klucz do tworzenia tablicy otwórz nawias okrągły max kropka 35 znaków zamknij nawias okrągły cudzysłów zamknij nawias okrągły zamknij nawias kwadratowy przecinek. Linia 6. otwórz nawias kwadratowy sg kropka Input otwórz nawias okrągły key znak równości cudzysłów klucz cudzysłów zamknij nawias okrągły zamknij nawias kwadratowy przecinek. Linia 7. otwórz nawias kwadratowy sg kropka Radio otwórz nawias okrągły cudzysłów Szyfruj cudzysłów przecinek 1 przecinek key znak równości cudzysłów s cudzysłów przecinek default znak równości True zamknij nawias okrągły przecinek. Linia 8. sg kropka Radio otwórz nawias okrągły cudzysłów Odszyfruj cudzysłów przecinek 1 przecinek key znak równości cudzysłów o cudzysłów zamknij nawias okrągły zamknij nawias kwadratowy przecinek. Linia 9. otwórz nawias kwadratowy sg kropka Text otwórz nawias okrągły cudzysłów cudzysłów asterysk 40 przecinek size znak równości otwórz nawias okrągły 40 przecinek 1 zamknij nawias okrągły przecinek auto podkreślnik size podkreślnik text znak równości True przecinek key znak równości cudzysłów minus OUT minus cudzysłów zamknij nawias okrągły zamknij nawias kwadratowy przecinek. Linia 10. otwórz nawias kwadratowy sg kropka Button otwórz nawias okrągły apostrof Wykonaj apostrof zamknij nawias okrągły przecinek sg kropka Exit otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy zamknij nawias kwadratowy. Linia 11. okno znak równości sg kropka Window otwórz nawias okrągły apostrof Szyfr Playfair apostrof przecinek uklad zamknij nawias okrągły. Linia 13. while True dwukropek. Linia 14. event przecinek values znak równości okno kropka read otwórz nawias okrągły zamknij nawias okrągły. Linia 15. klucz podkreślnik txt znak równości values otwórz nawias kwadratowy cudzysłów klucz cudzysłów zamknij nawias kwadratowy. Linia 17. if event znak równości znak równości apostrof Exit apostrof or event is None dwukropek. Linia 18. break. Linia 19. if event znak równości znak równości apostrof Wykonaj apostrof dwukropek. Linia 20. if values otwórz nawias kwadratowy apostrof s apostrof zamknij nawias kwadratowy dwukropek. Linia 21. wynik znak równości szyfruj podkreślnik playfair otwórz nawias okrągły values otwórz nawias kwadratowy cudzysłów dane cudzysłów zamknij nawias kwadratowy przecinek klucz podkreślnik txt zamknij nawias okrągły. Linia 22. okno otwórz nawias kwadratowy cudzysłów minus OUT minus cudzysłów zamknij nawias kwadratowy kropka update otwórz nawias okrągły wynik zamknij nawias okrągły. Linia 23. if values otwórz nawias kwadratowy apostrof o apostrof zamknij nawias kwadratowy dwukropek. Linia 24. wynik znak równości odszyfruj podkreślnik playfair otwórz nawias okrągły values otwórz nawias kwadratowy cudzysłów dane cudzysłów zamknij nawias kwadratowy przecinek klucz podkreślnik txt zamknij nawias okrągły. Linia 25. okno otwórz nawias kwadratowy cudzysłów minus OUT minus cudzysłów zamknij nawias kwadratowy kropka update otwórz nawias okrągły wynik zamknij nawias okrągły. Linia 26. okno kropka close otwórz nawias okrągły zamknij nawias okrągły. Linia 27. kratka wywołanie funkcji. Linia 28. gui podkreślnik szyfrowanie podkreślnik playfair otwórz nawias okrągły zamknij nawias okrągły.

Efektem działania powyższej funkcji będzie okno z możliwością wyboru operacji.

Ważne!

Aby zobaczyć wynik operacji szyfrowania lub deszyfrowania, przed powyższym kodem trzeba umieścić wszystkie zdefiniowane wcześniej funkcje!

RevWFTCH54IsX
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Słownik

divmod(a, b)
divmod(a, b)

funkcja, która dla pary liczb całkowitych zwraca parę liczb będących wynikiem dzielenia całkowitego argumentów oraz resztą z takiego dzielenia;

przykład:

Linia 1. print otwórz nawias okrągły divmod otwórz nawias okrągły 10 przecinek 5 zamknij nawias okrągły zamknij nawias okrągły.

wynik:

Linia 1. otwórz nawias okrągły 2 przecinek 0 zamknij nawias okrągły.
graficzny interfejs
graficzny interfejs

sposób prezentacji informacji przez komputer oraz interakcji z użytkownikiem polegający na rysowaniu i obsługiwaniu widżetów

index()
index()

funkcja zwracająca indeks i pierwszego wystąpienia danego elementu x w liście; jeżeli element nie występuje, zwracany jest błąd ValueError: substring not found, co oznacza, że danego elementu nie znaleziono;

przykład:

Linia 1. dni podkreślnik tygodnia znak równości otwórz nawias kwadratowy apostrof poniedzialek apostrof przecinek apostrof wtorek apostrof przecinek apostrof sroda apostrof przecinek apostrof czwartek apostrof przecinek apostrof piatek apostrof przecinek apostrof sobota apostrof przecinek apostrof niedziela apostrof zamknij nawias kwadratowy. Linia 2. print otwórz nawias okrągły dni podkreślnik tygodnia kropka index otwórz nawias okrągły apostrof sroda apostrof zamknij nawias okrągły zamknij nawias okrągły.

wynik:

Linia 1. 2.
PySimpleGUI
PySimpleGUI

biblioteka do wyświetlania prostych okien dialogowych, niezależna od systemu operacyjnego; nie jest dostępna w standardowej instalacji języka Python - należy ją zainstalować, korzystając z mechanizmu pip

yield
yield

wyrażenie służące – podobnie jak instrukcja return – do zwracania wyniku; tworzy tzw. generator, czyli funkcję, która po zwróceniu wyniku zapamiętuje stan zmiennych lokalnych i w kolejnych wywołaniach wykorzystuje zapamiętane wartości do zwracania kolejnych wyników

szyfrogram
szyfrogram

zaszyfrowana wiadomość