W celu zaszyfrowania tym szyfrem należy ustalić dwa słowa klucze. Na podstawie pierwszego z nich należy utworzyć szachownicę Polibiusza. Drugi klucz z kolei służy do właściwego szyfrowania tekstu jawnego. Ze względu na wybraną metodę szyfrowania, szachownice Polibiusza, literę J zastępuje się poprzez literę I.
Załóżmy, że tajnym kluczem na podstawie, którego zostanie utworzona szachownica to POLIBIUSZ. Pierwszy krok polega na zastąpieniu ewentualnej litery J poprzez I. Jeśli jest litera, która się powtarza to należy usunąć wszystkie jej wystąpienie prócz pierwszego. W tym przypadku klucz POLIBIUSZ zostanie zmienione na POLIBUSZ. Kolejny krok polega na utworzeniu tabelki 5x5 takiej jak poniżej i wpisaniu pierwszego, już wstępnie zmodyfikowanego, klucza:
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
1 | P | O | L | I | B |
2 | U | S | Z | ||
3 | |||||
4 | |||||
5 |
Pozostałe miejsca w tabelce należy wypełnić wierszami od prawe do lewej przy pomocy kolejnych liter alfabetu, ale bez litery J. Jeśli dana litera już w szachownicy występuje to zostaje pominięta. Po zakończeniu tego etapu szachownica Polibiusza jest gotowa:
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
1 | P | O | L | I | B |
2 | U | S | Z | A | C |
3 | D | E | F | G | H |
4 | K | M | N | Q | R |
5 | T | V | W | X | Y |
Na podstawie tabelki każdy znak uzyskuje unikalny kod. Kod jest to liczba, która powstaje poprzez zlepienie cyfry kolumny i wiersza położenia wybranej litery w tabelce. Przykładowo w celu zaszyfrowania litery G należy odczytać jej położenie: trzeci wiersz i czarna kolumna. Kod litery G to 34. Załóżmy, że drugi klucz to HASLO, wtedy kolejne litery mają takie kody:
Jawny klucz 2 | H | A | S | L | O |
---|---|---|---|---|---|
Zakodowany klucz 2 | 35 | 24 | 22 | 13 | 12 |
Załóżmy, że do zaszyfrowania jest wyrażenie TAJNA INFORMACJA. Należy z niego usunąć wszystkie nieszyfrowane znaki, a następnie zamienić każdą literę na odpowiadający jej kod. Następnie do kodu i-tej litery dodaje się kod i mod n znaku klucza 2, gdzie n to długość klucza 2. Wyznaczona suma to zaszyfrowana wartość i-tej litery. Przykładowo szyfrowania przebiega następująco:
Tekst zakodowany | 51 | 24 | 14 | 43 | 24 | 14 | 43 | 33 | 12 | 45 | 42 | 24 | 25 | 14 | 24 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Klucz 2 | 35 | 24 | 22 | 13 | 12 | 35 | 24 | 22 | 13 | 12 | 35 | 24 | 22 | 13 | 12 |
Szyfrogram | 86 | 48 | 36 | 56 | 36 | 86 | 67 | 55 | 25 | 57 | 77 | 48 | 47 | 27 | 36 |
Na koniec uzyskane wartości liczbowe szyfrogramu należy zapisać jedna koło drugiej rozdzielając przecinkiem. W tym przypadku szyfrogram to: 86, 48, 36, 56, 36, 86, 67, 55, 25, 57, 77, 48, 47, 27, 36.
W celu rozszyfrowania danych należy znać obydwa klucza i na podstawie pierwszego utworzyć szachownicę. Następnie przy pomocy drugiego klucza uzyskać kody dwucyfrowe kody liter poprzez odjęcie od kolejnych liczb szyfrogramu kod kolejnej litery klucza 2. Ten etap może wyglądać następująco:
Szyfrogram | 86 | 48 | 36 | 56 | 36 | 86 | 67 | 55 | 25 | 57 | 77 | 48 | 47 | 27 | 36 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Klucz 2 | 35 | 24 | 22 | 13 | 12 | 35 | 24 | 22 | 13 | 12 | 35 | 24 | 22 | 13 | 12 |
Tekst zakodowany | 51 | 24 | 14 | 43 | 24 | 14 | 43 | 33 | 12 | 45 | 42 | 24 | 25 | 14 | 24 |
Kolejny krok polega na odszukaniu każdego kolejnego wyliczonego kodu i na tej podstawie zapisanie rozszyfrowanego tekstu jawnego. W tym
Tekst zakodowany | 51 | 24 | 14 | 43 | 24 | 14 | 43 | 33 | 12 | 45 | 42 | 24 | 25 | 14 | 24 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Tekst jawny | T | A | I | N | A | I | N | F | O | R | M | A | C | I | A |
Jak widać pomimo, że szyfrowaną wiadomością było TAJNA INFORMACJA to po rozszyfrowaniu jest ona zapisana jako TAINA INFORMACIA. Jest to spowodowane brakiem litery J w szachownicy Polibiusza. Jednym z rozwiązań jest usunięcie innej litery niż J. Przykładowo w języku polskim praktycznie nieużywanymi znakami są V i X.
W celu przyśpieszenia szyfrowania danych tablica nie będzie przechowywana jako tablica. Utworzona zostanie lista 25 liczb. Każda z nich będzie odpowiadać kolejnej literze alfabetu, z pominięciem litery J. Przykładowo, aby uzyskać kod litery C wystarczy wybrać element o indeksie 2 z listy (indeksowanie od 0).
(1.) Zwróć listę liczb jako klucz kodujący na podstawie podanego argumentu klucz1, którym jest klucz 1. (2.) Utwórz listę i (3. - 4.) wypełnij ją zerami. Zero oznacza, że dana litera nie ma jeszcze przypisanego kodu. (5.) Zadeklaruj zmienne wiersz, kolumna, które będą przechowywały na której pozycji znak jest aktualnie przechowywany. (6.) Dla każdego znaku w klucz1: (7.) spróbuj dopisać każdy jego znak na listę, a następnie (8. - 9.) spróbuj dopisać każdą literę alfabetu. (10.) Na koniec zwróć utworzoną listę alfabet.
Tworzenie klucza jest wspomagane przez funkcję dopiszZnak(), która sprawdza czy dany znak ma już kod i jeśli nie ma to go przypisuje. Ponadto sprawdza czy dopisywany znak jest prawidłowy. Oto kod:
(1.) Funkcja przyjmuje cztery argumenty: alfabet - aktualną szachownicę, znak - znak do dopisania, wiersz i kolumna - aktualne miejsce zapisu danych. (2.) Jeśli znak w alfabecie występuje po lub jest literą J to zmniejsz wartość znaku. Następnie (3.) sprawdź czy znak ma już kod. Jeśli nie to (4.) oblicz kod na podstawie pozycji i (5. - 9.) przejdź do następnego wolnego pola w szachownicy.
Do szyfrowania wprowadzonych danych służy funkcja szyfruj(), która przyjmuje trzy argumenty: klucz1, klucz2 oraz szyfrogram:
(2.) Utwórz szachownice. (3.) Pobierz długość tekstu wynikowego i (4.) utwórz listę wynikową. (5.) Zakładamy, że ostatni znak na liście wynikowej będzie miał wartość 0. Będzie to zawsze ostatnia liczba na liście (tj. wartownik). (6.) Kolejne znaki tekstu jawnego: (7.) zaszyfruj na podstawie szachownicy i klucza 2. Przed (9.) zwróceniem wyniku (8.) usuń utworzoną szachownicę.
Funkcja szyfruj() korzysta z funkcji pomocniczej kodujZnak(), która na podstawie danej szachownicy, znaku tekstu jawnego oraz klucza 2 zwraca wartość wynikową do szyfrogramu.
(2. - 3.) Uwzględnij pominięcie znaku J. (4.) Zwróć sumę kodów znaku tekstu jawnego oraz znaku z klucza 2.
Dane można rozszyfrować przy pomocy funkcji deszyfruj(). Przyjmuje trzy argumenty: klucz1, klucz2 - klucze szyfrujące podane przez użytkownika oraz szyfrogram - wiadomość do rozszyfrowania.
(2.) Wyznacz szachownicę Polibiusza. (3. - 5.) Oblicz długość tekstu wynikowego korzystają z faktu, że na końcu tablicy znajduje się wartość 0. (6. - 7.) Utwórz tablicę wynikową i dopisz znak końca danych. (8.) Każdy znak szyfrogramu: (9.) rozkoduj i dopisz na tablicę wynikową. (10.) Usuń szachownicę i (11.) zwróć wynik.
Do rozkodowywania znaków funkcja deszyfruj() korzysta z funkcji rozkodujZnak()
(2.) Uwzględnij brak litery J w alfabecie. (3.) Odejmij od wartości z szyfrogramu wartość znaku z klucza 2. (4. - 7.) znajdź zaszyfrowany znak w szachownicy, a potem (8.) konwertuj na literę. (9.) Uwzględnij brak litery J i (10.) zwróć wyliczony znak.
W celu przetestowania działania powyższych funkcji można skorzystać z poniższej funkcji main(). Po uruchomieniu program zapyta się o klucze oraz tekst do zaszyfrowania.
W celu wypisania zaszyfrowanych danych z zwróconej listy liczb przez funkcję szyfruj() program korzysta z funkcji wypiszListe(). Korzysta ona z faktu, że na końcu listy stoi 0.
Napisz wersję programu, która wczyta kolejno klucz 1, klucz 2, pojedynczy znak, a na koniec tekst do zaszyfrowania. Wczytany pojedynczy znak program ma wykluczyć podczas pisania wyznaczania szachownicy w procesie szyfrowania / deszyfrowania. W ten sposób użytkownik będzie mógł wykluczyć inny znak niż J.
Przykładowo dla danych:
Program wypisze na ekran zaszyfrowaną wersję i rozszyfrowaną: