Szyfr Trójcyfrowy do szyfrowania potrzebuje klucza złożonego ze wszystkich cyfr z warunkiem, że każda cyfra może wystąpić dokładnie tylko jeden raz. W celu utworzenia tabelki szyfrującej potrzebne jest jeszcze słowo klucz z którego usuwa się powtarzające się litery i dopisuje na koniec w kolejności alfabetycznej wszystkie pozostałe litery alfabetu. Następnie dane wpisuje się do tabelki o szerokości 10 i wysokości 3. W nagłówkach należy zapisać kolejne cyfry z klucza liczbowego, a następnie do tabeli do kolejnych wierszy wpisać utworzony alfabet na podstawie słowa klucza. Ostatnia kolumna powinna pozostać pusta. Szyfrowanie odbywa się poprzez wyszukanie litery w tabeli i zastępienia danej litery cyfrą z nagłówka, a znaki interpunkcyjne przy pomocy cyfry w ostatniej kolumnie.
Szyfr jednak niw tworzy szyfrogramu, który można jednoznacznie odczytać, ponieważ jedną cyfrę można intepretować na 3 sposoby. Z tego powodu raczej jest to szyfr, który pozwala na wysłanie swojego rodzaju sumy kontrolnej czy dane są prawdziwe. W zadaniach została opisana metoda, która pozwala na utworzonie szyfru na podstawie przekazanych kroków.
Weźmy przykładowo klucz liczbowy 0749128356, a następnie słowo kluczowe "HASLO". Szyfrowanym tekstem będzie "TAJNA INFORMACJA". Pierwszy etap polega na utworzeniu alfabetu na podstawie słowa kluczowego. W słowie "HASLO" litery się nie powtarzają, więc wystarczy dopisać pozostałe litery alfabetu w kolejności alfabetycznej. Alfabet ostatecznie to "HASLOBCDEFGIJKMNPQRTUVWXYZ". Drugi etap to przygotowanie tabelki szyfrującej.
0 | 7 | 4 | 9 | 1 | 2 | 8 | 3 | 5 | 6 |
---|---|---|---|---|---|---|---|---|---|
H | A | S | L | O | B | C | D | E | - |
F | G | I | J | K | M | N | P | Q | - |
R | T | U | V | W | X | Y | Z | - | - |
Teraz można rozpocząć szyfrowanie. W celu zaszyfrowania litery 'T' należy ją zlokowalizować w tabeli. Jest w ostatnim wierszu w drugiej kolumnie, więc jest zastępowana przy pomocy cyfry 7. Następna litera A znajduje się w tej samej kolumnie w pierwszym wierszu, więc też jest zastępowana przez 7. Jedyny znak interpunkcyjny " " (spacja) zostane tu zastąpiony poprzez cyfrę 6, która znajduje się w ostatniej kolumnie.
Tekst jawny | T | A | J | N | A | I | N | F | O | R | M | A | C | J | A | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Szyfrogram | 7 | 7 | 9 | 8 | 7 | 6 | 4 | 8 | 0 | 1 | 0 | 2 | 7 | 8 | 9 | 7 |
Ostatecznie szyfrogram to 7798764801027897.
Poniższa implementacja zakłada poprawność danych wejściowych przez użytkownika. Zakłada się, że szyfrowane będą tylko wielkie litery, a wszystkie pozostałe będą traktowane jako znaki interpunkcyjne.
Zarówno podczas szyfrowania jak i tworzenia alfabetu przydatną funkcją jest funkcja wyszukaj(), która wyszuka w danym ciągu znaków data znak c i zwróci jego pozycję, a jeśli dany elemeny nie istnieje to zostanie zwrócona wartość -1.
Do tworzenia alfabetu na podstawie słowa klucza służy funkcja utworzAlfabet(), która jeko jedyny argument przyjmuje slowoKluczowe czyli klucz wczytany od użytkownika.
(2.) Oblicz długość alfabetu łacińskiego i (3.) alokuj miejsce pod alfabet wynikowy. (4.) Rozpocznij zapis od początku. Najpierw (5. - 8.) przepisz unikalne znaki z słowa klucza, a następnie (9. - 12.) dopisz niewystępujące litery z alfabetu. Na koniec (13.) dopisz znak końca danych i (14.) zwróć utworzony alfabet.
W celu zaszyfrowania danych należy podać tekst - tekst jawny do zaszyfrowania, liczba - klucz liczbowy do szyfrowania oraz klucz - słowo kluczowe potrzebne do utworzenia alfabetu.
(2.) Znajdź długość tekstu, (3.) utwórz alfabet i (4.) alokuj tablice wynikową pod zapis szyfrogramu. (5.) Dla każdej litery tekstu: (6.) pobierz znak. (7.) Jeśli jest to litera alfabetu łacińskiego to (8.) pobierz jej pozycję w alfabecie i (9.) pozycja modulo 9 zwróci w której jest kolumnie, więc wystarczy pobrać odpowiedni znak z klucz liczbowego. Dzięki takiemu rozwiązaniu unikamy tworzenia tabeli dwuwymiarowej. (10.) Jednak jeśli to nieznany znak to (11.) zastąp ostatnim znakiem słowak kluczowego. Na koniec kazdej iteracji (13.) dopisz znak do wyniku. Po zakończeniu pętli: (15.) dopisz znak końca danych, (16.) dealokuj pamięć użytą pod alfabet i (17.) zwróć wynik.
W celu przetestowania działania programu można skorzystać z poniższego fragmentu kodu. Program wczyta od użytkownika potrzebne informacje i wyświetli szyfrogram.
W celu bezproblemowego deszyfrowania danych brakuje wskazówek z którego wiersza tabeli należy wybrać. Z tego powodu prócz szyfrogramu można utworzyć dodatkowy szyfrogram wskazówkowy. Dopiero mając obydwa szyfrogramy będzie możliwe rozszyfrowania danych. Zaletą takiego rozwiązania jest fakt, że potrzebne są dwie zaufane osoby do uzyskania tekstu jawnego.
Rozpatrzmy ponownie przykład z początku artykułu. Klucz liczbowy 0749128356, a następnie słowo kluczowe "HASLO". Szyfrowanym tekstem będzie "TAJNA INFORMACJA". Alfabet to "HASLOBCDEFGIJKMNPQRTUVWXYZ", a tabelka szyfrująca:
0 | 7 | 4 | 9 | 1 | 2 | 8 | 3 | 5 | 6 |
---|---|---|---|---|---|---|---|---|---|
H | A | S | L | O | B | C | D | E | - |
F | G | I | J | K | M | N | P | Q | - |
R | T | U | V | W | X | Y | Z | - | - |
Ostatecznie szyfrogram to 7798764801027897. Teraz można przejść do tworzenia szyfrogrmau wskazówkowego. Litera 'T' znajduje się w 3 wierszu, więc dopisujemy 2 do szyfrogramu (indeksujemy wiersze od 0 w programie dla wygody). Następnie litera 'A', która też jest w szyfrogramie cyfrą 7 zyska w szyfrogramie wskazówkowym cyfrę 0, ponieważ jest w pierszym wierszu. Kontynuując ten proces otrzymamy:
Tekst jawny | T | A | J | N | A | I | N | F | O | R | M | A | C | J | A | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Szyfrogram | 2 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 2 | 1 | 0 | 0 | 1 | 0 |
Szyfrogram wskazówkowy to wtedy 2011001110210010. Dopiero zestawiając obydwa szyfrogram istnieje możliwość odczytania danych. Wtedy z szyfrogramu odczytuje się współrzędną X litery w tabeli, a z szyfrogramu wskazówkowego pozycję Y w tabeli. Niestety ten zabieg dalej prowadzi do utracenia znaków interpunkcyjnych, ale można założyć, że prócz znaków alfabetu łacińskiego można używać tylko spacji.
Poniższa tabela pokazuje proces deszyfrowania:
Szyfrogram | 7 | 7 | 9 | 8 | 7 | 6 | 4 | 8 | 0 | 1 | 0 | 2 | 7 | 8 | 9 | 7 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Wskazówki | 2 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 2 | 1 | 0 | 0 | 1 | 0 |
Tabela | T | A | J | N | A | I | N | F | O | R | M | A | C | J | A |
Napisz program, który po zaszyfrowaniu danych wyświetli na ekran szyfrogram oraz szyfrogram wskazówkowy. Następnie zaimplementuj funkcję, która pozwoli na odszyfrowanie danych na podstawie obu szyfrogramów.