Szyfr Nicodemus łączy w procesie szyfrowania danych zarówno transpozycje jak i podstawienie. Jego zaletą jest możliwość wykorzystania dowolnego szyfru podstawieniowego w celu zaszyfrowania danych. Sugerowanymi szyframi podstawieniowymi są Szyfr Vigenère oraz Szyfr Porta. Jego wadą jest fakt, że korzystając z szyfrów podstawieniowych nie jest on odporny na ataki, które wykorzystują częstotliwość występowania liter.
W celu zaszyfrowania danych szyfrem Nicodemus należy określić słowo klucz, które powinno składać się z unikalnych, pięciu liter. Na podstawie klucza należy utworzyć klucz liczbowy. Metoda polega na przyporządkowaniu każdej literze pozycję na której się znajduje po ustawieniu liter klucza w sposób alfabetycznie.
Przykładowo dla klucza "HASLO" otrzymamy 21534, ponieważ po posortowaniu alfabetycznie HASLO otrzymamy AHLOS.
Pierwszy etap szyfrowania danych polega na zapisaniu tekstu jawnego w wiersze po pięć znaków. Z kolei w pierszym wierszu, w nagłówku, należy zapisać otrzymany klucz liczbowy. Przykładowo dla "TAJNA INFORMACJA" otrzymujemy:
2 | 1 | 5 | 3 | 4 |
---|---|---|---|---|
T | A | J | N | A |
I | N | F | O | R |
M | A | C | J | A |
Gdyby w wybranym tekście jawnym długość tekstu jawnego nie byłaby podzielna przez pięć to należy dopisać na koniec np. odpowiednią ilość znaków przerwy, albo lepiej losowych znaków. Kolejny krok polega teraz na przestawieniu liter tak, aby w pierwszym wierszu liczby były posortowane rosnąco.
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
A | T | N | A | J |
N | I | O | R | F |
A | M | J | A | C |
Z tego można odczytać tymczasowy szyfrogram: ATNAJNIORFAMJAC, który następnie należy zaszyfrować dowolnym szyfrem podstawieniowym przy pomocy klucza podanego w formie znaków. Używając szyfru Vigenère ostatecznym szyfrogramem jest HTFLXUIGCTHMBLQ.
Warto zauważyć, że etap transpozycji i podstawienia nie są procesami oddzielnymi i trzeba zachowywać ich kolejności.
Przedstawiony przykładowy program zakłada, że wpisywane dane składają się jedynie z dużych liter alfabet łacińskiego. Nie jest sprawdzana poprawność wprowadzonych danych. Podany program działa poprawnie tylko, gdy długość tekstu jawnego jest wielokrotnością 5.
Utworzenie klucza liczbowego polega na uporządkowaniu liter klucza. Jednak przed sortowaniem należy do każdej wartości dołączyć jej pozycję początkową. Następnie po posortowaniu otrzymujemy pewne wartości, które wskazują gdzie dana litera była na początku. W tym momencie wystarczy, aby wartość z i-tej pozycji miała wartość i.
Najpierw (2. - 4.) utwórz kopię zmiennej klucz, ponieważ podczas sortowania dane zawarte w tej zmiennej uległyby zmianie. (5.) Utwórz tymczasową listę danych i (6. - 7.) przypisz każdej pozycji wartość pozycji. (8. - 15.) Używając sortowania bąbelkowego posortuj skopiowany klucz powiązany z utworzoną tymczasową listą danych. Po posortowaniu pozostaje (16. - 18.) utworzyć gdzie pozycja równa i-tej wartości na liście danych jest równa i. Przed (20.) zwróceniem wyniku należy (19.) usunąć tymczasowe zmienne.
Poniższa funkcja szyfruj() szyfruje dane zgodnie z podanym kluczem oraz Szyfrem Vigenère.
Funkcja kolejno: (2.) generuje klucz liczbowy i (3.) sprawdza długość tekstu wejściowego. Następnie (4.) tworzy nową tablicę pod zapisanie wyniku. (5.) Dla każdej kolejne litery: (6.) wyliczana jest wartość podstawienia, a następnie (7.) jest zapisywana do zmiennej wynik w odpowiednie miejsce. Po zamianie wszystkich znaków (8.) dopisz znak końca danych, (9.) usuń wygenerowany klucz i (10.) zwróć wynik.
Poniższa funkcja rozszyfruj() deszyfruje dane zgodnie z podanym kluczem oraz Szyfrem Vigenère. W tym przypadku jednak klucz zamiany musi zostać dodatkowy zintepretowany, ponieważ szukamy przekształcenia odwrotnego do tego podanego w kluczu liczbowym.
Funkcja kolejno: (2.) sprawdza długość tekstu wejściowego, (3.) tworzy nową tablicę pod zapisanie wyniku i (4.) generuje klucz liczbowy. (5.) Dla każdej kolejne litery: (6.) wyliczana jest wartość podstawienia, a następnie (7.) jest zapisywana do zmiennej wynik w odpowiednie miejsce. Tu warto zauważyć, że przekształcenie odwrotne polega na wyszukaniu w kluczu liczbowym kluczL aktualnej kolumny znaku. Po zamianie wszystkich znaków (8.) dopisz znak końca danych, (9.) usuń wygenerowany klucz i (10.) zwróć wynik.
Funkcja użyta do szukania danych nazywa się szukaj() i przyjmuje trzy argumenty: wartosc - szukana wartość, lista - lista danych oraz n - długość listy.
Poprawność działania napisanych funkcji można sprawdzić poniższą funkcją main(), któa wczytuje od użytkownika tekst jawny oraz klucz.
Napisz funkcję szyfruj() oraz rozszyfruj(), która szyfruje dane zgodnie z szyfrem Nicodemusa i jako szyfru podstawionego używa szyfru Porta.
Przykładowo dla tekstu 'TAJNAINFORMACJA' i klucz 'HASLO' poprawnym szyfrogram jest: 'QGESQKVFMZQZSSW'.