Szyfr Monome-Dinome to szyfr podstawieniowy, który w celu zaszyfrowania danych korzysta ze specjalnie przygotowanej tabeli o rozmiarach 3×8. Z tego powodu w alfabecie dwa znaki łacińskie muszą być połączone z innymi lub wykluczone z szyfrowania. Ostateczny szyfrogram składa się z samych cyfr.
Pierwszy etap podczas szyfrowania Monome-Dinome polega na przygotowaniu specjalnej tabelki 3×8. Tabelka powstaje poprzez wybranie słowa klucza, a następnie uzupełnienie wyrażenie do 24 liter poprzez dopisanie nie występujących w kluczu liter. Ze względu na ograniczenie do 24 znaków wyklucza się możliwość wpisywania liter J oraz X. Następny krok polega na wybraniu słowa klucz złożonego z 10 różnych cyfr. Następnie z takiego klucza liczbowego pierwsze osiem cyfr przepisujemy jako nagłówki kolumn tabeli, a pozostałe dwie cyfry jako nagłówki wierszy drugiego oraz trzeciego.
Mają przygotowaną tabelke można przejść do szyfrowania. Każdy szyfrowany znak należy znaleźć w tabelce i określić w której kolumnie oraz wierszu się znajduje. Jeśli znak znajduje się w pierwszym wierszu to znak jest szyfrowany jedynie poprzez nagłówek kolumny. W przeciwnym wypadku należy zaszyfrować przy pomocy nagłówku wiersza oraz nagłówku kolumny względem komórki gdzie dany znak się znajduje. Po zapisaniu wszystkich cyfr koło siebie otrzymujemy szyfrogram.
W celu odszyfrowania danych należy brać kolejne liczby. Jeśli dana cyfra jest nagłówkiem wiersza to oznacza, że litera została zaszyfrowana przez dwie kolejne cyfry. W przeciwnym wypadku została zaszyfrowana jednym znakiem, który oznacza, że należy z pierwszego wiersza wybrać wartość w kolumnie wskazaną przez cyfre.
W pierwszym etapie należy utworzyć tabelke do szyfrowania. Przykładowa poprawna tabelka utworzona na podstawie słowa kluczowego HASLO oraz liczby 0195827346 wygląda następująco:
0 | 1 | 9 | 5 | 8 | 2 | 7 | 3 | |
---|---|---|---|---|---|---|---|---|
- | H | A | S | L | O | B | C | D |
4 | E | F | G | I | K | M | N | P |
6 | Q | R | T | U | V | W | Y | Z |
Załóżmy, że będziemy szyfrować wyrażenie "SZYFROWANIE". Pierwsza litera S znajduje się w pierwszym wierszu, więc zostaje zaszyfrowana jedynie przez numer kolumny "9". Jednak litera Z znajduje się w trzecim wierszu, więc należy ją zaszyfrować nagłówkiem wiersza w którym się znajduje oraz nagłówkiem kolumny czyli "63". Kolejne litery są szyfrowane nastepuąco:
Znak | S | Z | Y | F | R | O | W | A | N | I | E |
---|---|---|---|---|---|---|---|---|---|---|---|
Szyfr | 9 | 63 | 67 | 41 | 61 | 8 | 62 | 1 | 47 | 45 | 40 |
Ostateczny szyfrogram to: 9636741618621474540.
Jak można zauważyć każda litera jest zastępowana przez jedną lub dwie cyfry prowadzi do zwiększenia długości szyfrowanego tekstu dwukrotnie. Z tego powodu warto przeanalizować, które litery występują najczęściej. W ten sposób zostanie ograniczona ilość znaków potrzebna do przechowywania zaszyfrowanych znaków.
Przedstawiona implementacja poniżej szyfrje dane zgodnie z szyfrem Monome-Dinome. Pozwala ona na ustawienie dowolnego słowa klucza oraz klucz liczbowego. W programie zakłada się poprawność danych wejściowych oraz, że wszystkie dane są pisane jedynie wielkimi literami alfabetu łacińskiego bez znaków J oraz X.
W celu uzupełnienia klucza pozostałymi znakami alfabetu należy wyszukąc kolejne litery alfabetu w kluczu i jeśli nie można ich odnaleźć to dopisać je na koniec. Zamiast przechowywać dane w tabeli to będą one przechowywane w postaci 24 znakowego tekstu.
(2.) Dla każdego znaku alfabetu łacińskiego: (3.) jeśli nie chcemy dodać wykluczonego znaku to (4.) sprawdź pozycję znaku w kluczu. (5.) Jeśli znak nie występuje to (6.) dopisz go.
Funkcja szyfrująca dane oczekuje podania trzech argumentów: tekst - tekst do zaszyfrowania, klucz - 24 znakowe słowo klucz użyte do szyfrowania oraz cyfry - 10 cyfrowy tekst.
(2.) Przygotuj zmienną wynikową. Następnie (3.) dla każdego znaku tekstu jawnego: (4.) wyszukaj jego pozycję w kluczu. (5.) Jeśli znak występuje to: (6.) oblicz jego pozycję w tabelce, a następnie (7. - 9.) określ jak dany znak ma zostać zaszyfrowany. Jeśli szyfrowany znak jest nieznany to (11.) tylko przepisz znak. Na koniec (14.) zwróć zmienną wynik.
Funkcja deszyfrująca przyjmuje te same argumenty co szyfrująca z tą różnicą, że w argumencie tekst znajduje sie szyfrogram, a nie tekst jawny.
(2.) Przygotuj zmienną wynikową. Następnie (3.) dla każdego znaku szyfrogramu: (4.) wyszukaj jego pozycję w słowie kluczu cyfry. (5.) Jeśli cyfra występuje to: (6.) sprawdź numer pozycji. W ten sposób określamy czy dana cyfra jest nagłówkiem kolumn czy wierszy. Jeśli cyfra jest nagłówkiem wiersz to: (7.) pobierz kolejny znak i określ w ten sposób numer kolumny (numer wiersza mamy) i (8.) wybierz odpowiedni znak z klucza. Jednak jeśli pierwsza cyfra oznacza kolumnę to (11.) przyjmij, że znak znajduje się w pierszym wierszu. Jeśli podczas deszyfrowania natrafimy na nieznany znak to (14.) przypiszmy go. Na sam koniec działania funkcji zwracamy (17.) wartość w zmiennej wynik.
Napisane funkcje można przetestować przy pomocy poniższego fragmentu kodu. Program wczyta od użytkownika potrzebne dane, a następnie wypisze zaszyfrowany tekst, a potem go rozszyfruje.