Strona główna » Algorytmy » Szyfry » Szyfr Pollux
 

Szyfr Pollux

Opis Szyfru

Szyfrowanie Pollux polega na zaszyfrowaniu informacji zakodowanej przy pomocy alfabetu Morse'a. Każdemu z trzech znaków przypisana jest pewna grupa cyfr szyfrujących z której wybierana jest losowana jedna cyfra, która zastąpi dany znak. Dane są szyfrowane na podstawie przyporządkowania cyfr do znaków wprowadzonego przez użytkownika.

Przyjmuje się, że każdemu znakowi najlepiej przypisać po tyle samo cyfr w grupie i ostatnią wolną cyfrę dołączyć do którejkolwiek z grup. W ten sposób powstaje największa szansa na wylosowanie bardzo zróżnicowanego szyfrogramu. Zazwyczaj czwarty znak przypisuje się znakowi pomiędzy słowami, ponieważ bardzo łatwo go wykryć podczas próby łamania szyfrogramu.

Przykład

Na początek należy ustalić przyporządkowanie grupy cyfr do każdego znaku występującego w alfabecie Morse'a. Przyjmujemy, że są nimi: kropka (sygnał krótki), myślnik (sygnał długi) oraz spacja (znak przerwy pomiędzy wyrazami). Weźmy przykładowo następujące przyporządkowanie:

Cyfra0123456789
Znak.--. . - .

Szyfrowane będzie wyrażenie "TEKST". Przed szyfrowaniem kolejnych znaków należy najpierw zakodować dane zgodnie z Alfabetem Morse'a. W tym przypadku zakodowany tekst to: - . -.- ... -. Teraz można przejść do losowania cyfr dla każdego znaku. Przykładowo dla pierwszego myślnika losujemy jedną cyfrę z listy {1, 2, 7}, a dla drugiego znaku spacji z listy {4, 6, 8}. Przykładowy szyfrogram wygląda następująco:

Znak- . -.- ... -
Los7434291650567

Otrzymany szyfrogram to 7434291650567, ale nie jest to jedyne poprawne rozwiązanie, ponieważ każdy znak można wylosować na kilka sposobów.

Implementacja

Niniejsza implementacja szyfru Pollux zakłada, że posiadamy funkcje do kodowania i dekodowania informacji zapisanych przy pomocy alfabetu Morse'a. Informacje dotycząca przechowywania/wczytywania alfabetu oraz kodowania można przeczytać tutaj.

Szyfrowanie danych

Funkcja szyfrująca szyfruj() przyjmuje trzy argumenty: alfabet - wczytany alfabet klucz-wartość, txt - tekst do zaszyfrowania oraz zamiany - przyporządkowanie takie, że i-ty znak wskazuje przyporządkowanie cyfry i-1.

C++
C#
  1. static string szyfruj(Slownik alfabet, string txt, string zamiany) {
  2.   string txtk = koduj(alfabet, txt);
  3.   string w = "";
  4.   Random r = new Random();
  5.   for (int i = 0; i < txtk.Length; i++) {
  6.     int poz = r.Next(0, 10);
  7.     while (zamiany[poz] != txtk[i])
  8.       poz = (poz + 1) % 10;
  9.     w += (char)(poz + '0');
  10.   }
  11.   return w;
  12. }

W celu zaszyfrowania danych należy najpierw (2.) zakodować go przy pomocy alfabetu Morse'a, a następnie (5. - 10.) dla każdego znaku wylosować cyfrę, która go zastąpi. Ze względu na to, że zakładamy poprawność danych wejściowych losowanie cyfry polega na (6.) wylosowaniu dowolnej pozycji, a następnie (7. - 8.) przechodzeniu w prawo, aby znaleźć cyfrę z grupy danego znaku i (9.) dopisaniu znaku do wyniku. Na koniec (11.) zwracamy wynik czyli szyfrogram złożony z cyfr.

Rozszyfrowanie danych

Podczas rozszyfrowania danych należy podać te same argumenty co podczas szyfrowania, aby funkcja odszyfruj() mogła odszyfrować informacje.

C++
C#
  1. static string odszyfruj(Slownik alfabet, string txt, string zamiany) {
  2.   string w = "";
  3.   for (int i = 0; i < txt.Length; i++)
  4.     w += zamiany[txt[i] - '0'];
  5.   return rozkoduj(alfabet, w + " ");
  6. }

(2.) Przygotuj zmienną wynikową, a następnie (3. - 4.) rozkoduj każde kolejne cyfry i (5.) zwróć rozkodowany alfabet Morse'a.

Testowanie funkcji

Poniższy fragment kodu wczyta od użytkownika przyporządkowania cyfr do znaków, a nastepnie na tej podstawie wygeneruje szyfrogram oraz pokaże rozszyfrowany tekst, aby można było sprawdzić czy funkcje działają poprawnie.

C++
C#
  1. static void Main(string[] args) {
  2.   Slownik alfabet = wczytajAlfabet();
  3.   Console.Write("Przypisz kazdej literze znak kropki, myslnika lub spacji\n0123456789\n");
  4.   string zamiany = Console.ReadLine();
  5.   Console.WriteLine("Wpisz tekst do zaszyfrowania:");
  6.   string txt = Console.ReadLine();
  7.   Console.WriteLine("\nZaszyfrowany tekst:");
  8.   string txtk = szyfruj(alfabet, txt, zamiany);
  9.   Console.WriteLine(txtk);
  10.   Console.WriteLine("\nRozszyfrowany tekst:");
  11.   string txtr = odszyfruj(alfabet, txtk, zamiany);
  12.   Console.WriteLine(txtr);
  13.   Console.ReadKey();
  14. }
Zadania
Zadanie 1
Kod źródłowy Zadanie 1Kod źródłowy Zadanie 1