Strona główna » Algorytmy » Szyfry » Szyfr Trójcyfrowy
123
 

Szyfr Trójcyfrowy

Opis

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.

Przykład

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.

0749128356
HASLOBCDE-
FGIJKMNPQ-
RTUVWXYZ--

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 jawnyTAJNA INFORMACJA
Szyfrogram 7798764801027897

Ostatecznie szyfrogram to 7798764801027897.

Implementacja

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.

Tworzenie alfabetu

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.

C++
C#
  1. static string utworzAlfabet(string slowoKluczowe) {
  2.   string alfabet = "";
  3.   for (int i = 0; i < slowoKluczowe.Length; i++) {
  4.     if (alfabet.IndexOf(slowoKluczowe[i]) == -1)
  5.       alfabet += slowoKluczowe[i];
  6.   }
  7.   for (int i = 'A'; i <= 'Z'; i++) {
  8.     if (alfabet.IndexOf((char)(i)) == -1)
  9.       alfabet += (char)(i);
  10.   }
  11.   return alfabet;
  12. }

(2.) Przygotuj puste słowo i (3. - 6.) przepisz wszystkie unikalne litery z słowa kluczowego, a następnie (7. - 10.) dopisz pozostałe litery alfabetu. Na koniec (11.) zwróć utworzony alfabet.

Szyfrowanie

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.

C++
C#
  1. static string szyfruj(string tekst, string liczba, string klucz) {
  2.   string alfabet = utworzAlfabet(klucz);
  3.   string wynik = "";
  4.   for (int i = 0; i < tekst.Length; i++) {
  5.     char c = tekst[i];
  6.     if (c >= 'A' && c <= 'Z') {
  7.       int poz = alfabet.IndexOf(c);
  8.       c = liczba[poz % 9];
  9.     } else {
  10.       c = liczba[9];
  11.     }
  12.     wynik += c;
  13.   }
  14.   return wynik;
  15. }

(2.) Utwórz alfabet i (3.) przygotuj puste słowo pod wynik. (4.) Dla każdej litery tekstu: (5.) pobierz znak. (6.) Jeśli jest to litera alfabetu łacińskiego to (7.) pobierz jej pozycję w alfabecie i (8.) 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. (9.) Jednak jeśli to nieznany znak to (10.) zastąp ostatnim znakiem słowak kluczowego. Na koniec kazdej iteracji (12.) dopisz znak do wyniku. Po zakończeniu pętli (14.) zwróć wynik.

Testowanie programu

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.

C++
C#
  1. static void Main(string[] args) {
  2.   Console.WriteLine("Podaj kod liczbowy:");
  3.   string liczba = Console.ReadLine();
  4.   Console.WriteLine("Podaj słowo kluczowe:");
  5.   string klucz = Console.ReadLine();
  6.   Console.WriteLine("Podaj tekst do zaszyfrowania:");
  7.   string tekst = Console.ReadLine();
  8.   string szyfrogram = szyfruj(tekst, liczba, klucz);
  9.   Console.WriteLine("Szyfrogram to:");
  10.   Console.WriteLine(szyfrogram);
  11.   Console.ReadKey();
  12. }

Zadania

Zadanie 1

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.

Przykład

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:

0749128356
HASLOBCDE-
FGIJKMNPQ-
RTUVWXYZ--

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 jawnyTAJNA INFORMACJA
Szyfrogram 2011001110210010

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 7798764801027897
Wskazówki 2011001110210010
TabelaTAJNA INFORMACJA

Polecenie

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.