Szyfry ADFGX i ADFGVX są to dwa bardzo podobne szyfry, który były używane podczas pierwszej wojny światowej w 1918 r. Pierwsza wersja ADFGX została opracowana przez pułkownika Fritza Nebela, który swój pomysł przedstawił wojsku niemieckiemu.
Początkowo szyfrowanie, w wersji ADFGX, odbywało się przy pomocy szachownicy Polibiusza. Jednak sama tablica była wypełniania literami w sposób losowy i była znana tylko nadawcy i odbiorcy. Kolejne wiersze jak i kolumny miały literowe nagłówki zgodnie z nazwą szyfru. Zgodnie z ideą szachownicy Polibiusza litery I oraz J były szyfrowane przy pomocy tej samej kombinacji znaków. Przykładowa, poprawna tabelka może wyglądać następująco:
A | D | F | G | X | |
---|---|---|---|---|---|
A | V | M | L | C | B |
D | Q | O | A | G | W |
F | N | P | Z | R | H |
G | I | S | K | T | D |
X | Y | F | Z | E | U |
Kolejny etap polega na zaszyfrowaniu kolejnych znaków tekstu jawnego. Przykładowo tekst TAJNA INFORMACJA będzie zaszyfrowany następująco:
Znak jawny | T | A | J | N | A | I | N | F | O | R | M | A | C | J | A |
Znak zaszyfrowany | GG | DF | GA | FA | DF | GA | FA | XD | DD | FG | AD | DF | AG | GA | DF |
Przedostatni etap polega na zaszyfrowaniu danych przy pomocy klucza. Ma to za zadanie dokonać transpozycji szyfrowanej wiadomości. Hasło składające się z n znaków tworzy tabelkę o n kolumnach. Następnie do każdej kolumny po kolei dopisuje się kolejny znak z tekstu zaszyfrowanego. Jeśli po zapisaniu do tabelki ostatniego znaku szyfrogramu w ostatnim wierszu są wolne miejsca to można je wypełnić dowolnymi znakami lub konkretną literą. Przykładowo wypełniona tabelka na podstawie dotychczasowego przykładu i hasła KLUCZ wygląda następująco:
K | L | U | C | Z |
---|---|---|---|---|
G | G | D | F | G |
A | F | A | D | F |
G | A | F | A | X |
D | D | D | F | G |
A | D | D | F | A |
G | G | A | D | F |
Ostatni etap szyfrowania polega na posortowaniu alfabetycznie kolumn według nagłówka kolumn, następnie odczytaniu wszystkich znaków wiersz po wierszu:
C | K | L | U | Z |
---|---|---|---|---|
F | G | G | D | G |
D | A | F | A | F |
A | G | A | F | X |
F | D | D | D | G |
F | A | D | D | A |
D | G | X | A | F |
W tym przypadku jest przesuwana tylko jedna kolumna C na początek tabelki. Szyfrogram tworzą znaki w kolejnych wierszach bez hasła czyli: FGGDGDAFAFAGAFXFDDDGFADDADGXA.
Podczas procesu deszyfrowania na początek należy zapisać szyfrogram w formie tabelki i dokonać transpozycji kolumn zgodnie z kluczem. Kolejny etap to jedynie odczytanie kolejnych dwóch znaków i znalezienie zaszyfrowanego znaku w tabelce.
Następca szyfru ADFGX miał identyczną metodę szyfrowania. Różnica polega na dodaniu literki V do nagłówka kolumn i wiersza tabelki według, której dane są szyfrowane. Zmiana pozwoliła na szyfrowanie wszystkich 26 znaków alfabetu oraz 10 znaków cyfr. Przykładowa, poprawna tabelka 6x6 mogłaby wyglądać następująco:
A | D | F | G | V | X | |
---|---|---|---|---|---|---|
A | B | D | I | 5 | M | T |
D | N | L | O | W | F | X |
F | 8 | 9 | 0 | A | 4 | 7 |
G | U | R | J | K | Q | S |
V | C | E | P | 3 | 2 | 1 |
X | H | V | G | Y | 6 | Z |
Implementacja szyfru będzie dotyczyć szyfrowania ADFGX. Użytkownik na wejściu będzie wprowadzał trzy linijki danych: tabelkę szyfrowania w postaci 25 znakowego tekstu, gdzie kolejne znaki to kolejne znaki z kolejnych wierszy od lewej do prawej. Druga linijka będzie zawierać klucz: ciąg znaków bez dwóch identycznych znaków. Trzecia linijka to tekst do zaszyfrowania. Kod przewiduje, że wszystkie znaki będą jedynie małymi znakami alfabetu łacińskiego.
Efektywny program to taki, który jest najszybszy i zużywa mało pamięci, dlatego program nie będzie wykonywał zadania krok po kroku tak jak było przedstawione w przykładzie. Funkcja szyfrująca wygląda następująco:
(1.) Funkcja szyfrująca wymaga trzech argumentów: table - tabeli używanych do zamiany, klucz - klucz użyty do szyfrowania oraz txt - tekst do zaszyfrowania. (2.) Pobierz długość tekstu i (3.) wylicz ile znaków będzie faktycznie zapisanych. Związku z tym, że transpozycja wymaga równej długości wierszy to może istnieć potrzeba dopisania dodatkowych znaków. (4.) Ustal litery nagłówków wierszy / kolumn. (5. - 6.) Przygotuj pamięć pod zapis szyfrogramu.
(7.) Przygotuj klucz do szyfrowania. Zwrócona lista określa jak zamienione zostały kolumny. (8.) Zmienne pomocnicze, które pomagają określić, gdzie zapisywany jest znak oraz (9.) który znak jest aktualnie szyfrowany. (10.) Dla każdego znaku: (11.) znajdź w tabelce pozycję znaku i an tej podstawie (12. - 13.) określ jakie litery należy dopisać do szyfrogramu. (15.) Zmień indeks zapisywanego znaku na ilość zapisanych znaków i (16. - 18.) uzupełnij wolne pola tabelki przy pomocy znaku x. (19.) Usuń klucz przesunięcia i (20.) zwróć wynik.
Przygotowanie klucza polega na zapisaniu do której kolumny znak z i-tej kolumny ma zostać zapisany.
(1.) Na podstawie klucza utwórz tablicę przesunięć kolumn: (2.) pobierz długość klucza i (3.) utwórz tablicę liczb o tej samej długości. (4.) Utwórz indeks dla listy klucz_przes. (5.) Dla każdej litery znaku alfabetu: (6.) sprawdź czy występuje w kluczu. Jeśli tak to zapisz pod tą samą pozycją co w kluczu na jaką tabelkę jest zamieniana. (10.) Na koniec zwróć utworzoną listę.
Na podstawie obecnego szyfrogramu, klucza, klucza przesunięć i aktualnej pozycji zapisu zapisz znak.
(2.) Wylicz pozycję zapisu znaku uwzględniając przesunięcie. (3. - 7.) Przejdź do następnej pozycji zapisu.
Powyższe funkcje wspomaga funkcja znajdz(), która dla podanego znaku c zwraca jego pozycję w łańcuchu txt. Jeśli znak nie występuje to zwracane jest -1.
Zgodnie z metodą deszyfrowania:
(2. - 7.) Przygotuj dane do deszyfrowania. (8.) Dla każdej pary znaków: (9. - 10.) odczytaj pozycję x, y znaku w tabelce i (11.) na tej podstawie znajdź znak i dopisz do wyniku. (13.) Posprzątaj zbędne dane i (14.) zwróć tekst jawny.
Funkcja pobierająca odpowiedni znak jest niemalże identyczna do funkcji dopiszZnak():
W celu przetestowania funkcji można skorzystać z poniższej funkcji main(), która zgodnie ze specyfikacją wczytuje dane od użytkownika:
Przykładowo poprawnymi danymi wejściowymi są:
Napisz program, który będzie szyfrował dane zgodnie z szyfrem ADFGVX. Specyfikacja pozostaje zgodna z przedstawioną implementacją szyfru ADFGVX.
Przykładowo dla danych:
Program wypisze na ekran: