Quagmire I to szyfr podstawieniowy, który jest jedną z czterech wariacji szyfru Quagmire. Do szyfrowania używane jest hasło oraz słowo kluczowe. Takie połączenie zwiększa skuteczność szyfrowania.
W celu zaszyfrowania informacji przy pomocy szyfru Quagmire I należy wpierw określić hasło oraz słowo klucz. Hasło służy do utworzenia zaszyfrowanego alfabetu. W celu jego utworzenia należy ustalić hasło, a następnie zostawić tylko pierwsze wystąpienia każdej litery i uzupełnić nie wystepującymi znakami z alfabetu. Ostatecznie zaszyfrowany alfabet powinien mieć taką samą długość co przyjęty alfabet oraz powinien mieć wszystkie znaki różne.
Następnie na podstawie słowa klucz tworzy się tabelką podstawień. W celu utworzenia takiej tabelki w pierwszym wierszu należy zapisać zaszyfrowany alfabet (po jednej literze w każdej kolumnie). Pod literą 'A' w pierszym wierszu należy zapisać pionowo słowo kluczowe. Każdy wiersz uzupełnia się literami alfabetu jawnego poprzez zapisanie po lewej i po prawej znanej litery w wierszu odpowiedniego poprzednie i kolejne znaki, które są wybierane cyklicznie.
W celu zaszyfrowania danych należy pogrupować litery po tyle znaków jaką długość ma słowo kluczowe. Następnie każdy kolejny znak jest zamieniany na podstawie tabeli podstawień. Litera c jest szukana w pierwszym wierszu tabeli, a następnie pobierany jest znak w tej samej kolumnie co został znaleziony znak, ale k pozycji dalej, gdzie k to numer znaku w grupie (indeksujemy od 0). Po zamianie wszystkich znaków otrzymujemy szyfrogram.
Poniżej zostanie przedstawiony proces szyfrowania tekstu "TAJNAINFORMACJA" przy pomocy hasła "TAJNEHASLO" i słowem kluczowym "KLUCZ". Pierwszy etap polega na utworzeniu zaszyfrowanego alfabetu. W tym celu wpierw usuwamy powtarzające się litery (prócz pierwszego ich wystąpienia) i otrzymujemy "TAJNEHSLO", a następnie uzupełniamy przy pomocy liter alfabetu jawnego: "TAJNEHSLOBCDFIKMNPQRUVWXYZ".
Teraz można przejść do tworzenia tabeli. W pierwszy wiersz wpisany zostaje zaszyfrowany alfabet, a klucz zostanie zapisany w kolumnie pod literą 'A'. Następnie każdy wiersz zostaje uzupełniony alfabetem jawnym tak, że na prawo są kolejne znaki, a na lewo poprzednie znaki, które są wybierane cyklicznie.
T | A | J | N | E | H | S | L | O | B | C | D | F | I | K | M | N | P | Q | R | U | V | W | X | Y | Z |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I |
K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J |
T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S |
B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A |
Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X |
Tabela podstawień została utworzona. Przed rozpoczęciem szyfrowania warto pogrupować litery. W tym przypadku słowo klucz ma dokładnie 5 liter, więc po tyle samo znaków będzie mieć każda z grup.
TAJNA | INFOR | MACJA |
Litera 'T' znajuje się w pierwszej kolmnie i jest zastępowana przez literę 'J' z kolejnego wiersza. Kolejna litera 'A' jest druga w grupie, więc pobieramy wiersz z drugiej kolumny i trzeciego wiersza. Jest to litera 'L'. Z kolei litera 'F' znajduje się w 13 kolumnie i jest trzecia w grupie, więc jej odpowiednik jest w czwartym wierszu i jest to 'F'. Poniżej została przedstawiona pełna lista zamian:
Znak | T | A | J | N | A | I | N | F | O | R | M | A | C | J | A |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
W grupie | 1 | 2 | 3 | 4 | 5 | 1 | 2 | 3 | 4 | 5 | 1 | 2 | 3 | 4 | 5 |
Szyfrogram | J | L | V | E | Z | X | N | F | J | R | Z | L | D | D | Z |
Otrzymany szyfrogram to "JLVEZXNFJRZLDDZ".
Funkcja uzupelnijAlfabet() przyjmuje jeden argument a - hasło użyte do szyfrowania. Wynikiem działania funkcji jest zaszyfrowany alfabet.
Proces uzupełniania alfabet został podzielony na dwa etapy. (2. - 4.) W pierwszym przepisywane są kolejne znaki hasła pod warunkiem, że do tej pory taka litera nie została przepisana, a drugi etap polega na (5. - 7.) sprawdzeniu, których liter alfabetu brakuje.
Utworzona tabela podstawień będzie tablicą wartości typu string. W tabeli nie będzie przetrzymywany zaszyfrowany alfabet (zostanie on przekazany oddzielnie). Funkcja utworzTabele() potrzebuje podania dwóch argumentów: alfabet - zaszyfrowany alfabet oraz klucz - słowo klucz.
(2.) Utwórz tablicę wynikową i (3.) znajdź kolumnę w której zaszyfrowany alfabet ma literę 'A'. (4.) Dla każdego wiersza: (5.) określ pierwszy znak w wierszu i (6. - 10.) uzupełnij wiersz. Na koniec (12.) zwróć utworzoną tabele.
Do zaszyfrowania danych program potrzebuje podania następujących argumentów: tekst - tekst jawny do zaszyfrowania, alfabet - zaszyfrowany alfabet utworzony z hasła, tabela - tabela podstawień oraz n - długość słowa klucza.
(2.) Przygotuj zmienną do zapisu wyniku i (3.) dla każdego znaku: (4.) określ kolumnę, a następnie (5.) przepisz do wyniku. Na koniec (7.) zwróć zmienną w, która przechowuje szyfrogram.
Funkcja rozszyfruj() działa analogicznie do funkcji szyfruj(). W tym przypadku została zamieniona kolejność wybierania z tabeli.
Poprawność działania napisanych funkcji można przetestować przy pomocy poniżeszego fragmentu kodu, który pozwala na wczytanie danych od użytkownika.