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

Szyfr Swagman

Szyfr

Szyfr Swagman to szyfr transpozycyjny, który szyfruje dane na podstawie specjalnie przygotowanego klucza. Klucz to tablica liczb n×n. W każdym wierszu i w każdej kolumnie występują wszystkie liczby ze zbioru {1, 2, .., n}. Wielkość klucza jest dowolna, ale przyjmuje się, że wielkość powinna być nie mniejsza niż 4 i nie większa niż 8. Długość szyfrowanego tekstu musi być wielokrotnością liczby n. Dzięki temu można utworzyć tabelkę n×(długość tekstu / n). Tekst jawny należy wpisać do tabelkami wiersz po wierszu.

Po przygotowaniu tabelki można przejść do dokonania transpozycji. Każda kolumna jest szyfrowana przez kolejną kolumnę klucza w sposób cykliczny. Transpozycja polega na tym, by powiązać i-tą cyfrę z klucza z wybranej kolumny z i-tym znakiem z kolumny tabelki i posortować według wartości klucza. Szyfrogram jset już prawie gotowy. Wystarczy bowiem odczytać kolejne kolumny od góry do dołu.

Przykład

Weźmy przykładowo tekst "TAJNAINFORMACJA" i następujący klucz:

231
312
123

Warto zauważyć, że w kluczu w każdym wierszu i każdej kolumnie wartości się nie duplikują. Teraz można przejść do rozpisania tabelki dla tekstu jawnego. Ze względu na to, że klucz ma rozmiar n = 3 to szerokość tabeli to 15/3 = 5. Od razu do znaków można dołączyć wartości z klucza w nawiasach.

T (2)A (3)J (1)N (2)A (3)
I (3)N (1)F (2)O (3)R (1)
M (1)A (2)C (3)J (1)A (2)

Teraz w tak przygotowanej tabelce wystarczy posortować każdą kolumnę oddzielnie i odczytać kolejne kolumny od lewej do prawej.

M (1)N (1)J (1)J (1)R (1)
T (2)A (2)F (2)N (2)A (2)
I (3)A (3)C (3)O (3)A (3)

Po zaszyfrowaniu otrzymaliśmy szyfrogram: "MTINAAJFCJNORAA". W celu rozszyfrowania należy wykonać kroki w sposób odwrotny: zapisać ostatni wygląd tabelki. Dopasować liczby do klucza, a następnie odczytać kolejne wiersze.

Implementacja

Przedstawiony poniżej program zakłada poprawność danych wejściowych. W celu uproszczenia kodu klucz jest przechowywany jako tablica liczb i nie jest tworzona żadna dodatkowa tabelka w celu dokonania transpozycji.

Szyfrowanie

Szyfrowanie wymaga podania trzech argumentów: txt - tekst jawny do zaszyfrowania, klucz - lista liczb oraz kluczN - rozmiar tabeli klucza.

  1. char* szyfruj(char* txt, int* klucz, int kluczN) {
  2.   int dl = strlen(txt);
  3.   int szer = ceil(dl / kluczN);
  4.   char* wynik = new char[kluczN*szer + 1];
  5.   for (int y = 0; y < kluczN; y++) {
  6.     for (int x = 0; x < szer; x++) {
  7.       int el = y*szer + x;
  8.       char c = el < dl ? txt[el] : ' ';
  9.       int przes = klucz[x%kluczN + y*kluczN] - 1;
  10.       wynik[x*kluczN + przes] = c;
  11.     }
  12.   }
  13.   wynik[kluczN*szer] = '\0';
  14.   return wynik;
  15. }

(2.) Pobierz długość tekstu i (3.) wylicz szerokość tabelki do zapisu danych. (4.) Przygotuj tablicę pod wynik szyfrogram. (5.) Dla każdego wiersza i (6.) każdej kolumny tablicy: (7.) oblicz, który znak by tam został wstawiony. Następnie (8.) pobierz znak jeśli nie istnieje zastąp domyślnym znakiem tu: spacją. (9.) Z klucza pobierz numer wiersza w kolumnie i (10.) wstaw znak do szyfrogramu w odpowiednie miejsce. Na koniec (13.) dopisz znak końca danych i (14.) zwróć szyfrogram.

Rozszyfrowanie

Rozszyfrowanie wymaga podania trzech argumentów: txt - szyfrogram do odszyfrowania, klucz - lista liczb oraz kluczN - rozmiar tabeli klucza.

  1. char* szyfruj(char* txt, int* klucz, int kluczN) {
  2.   int dl = strlen(txt);
  3.   int szer = ceil(dl / kluczN);
  4.   char* wynik = new char[kluczN*szer + 1];
  5.   for (int y = 0; y < kluczN; y++) {
  6.     for (int x = 0; x < szer; x++) {
  7.       int el = y*szer + x;
  8.       char c = el < dl ? txt[el] : ' ';
  9.       int przes = klucz[x%kluczN + y*kluczN] - 1;
  10.       wynik[x*kluczN + przes] = c;
  11.     }
  12.   }
  13.   wynik[kluczN*szer] = '\0';
  14.   return wynik;
  15. }

(2.) Pobierz długość tekstu i (3.) wylicz szerokość tabelki do zapisu danych. (4.) Przygotuj tablicę pod wynik szyfrogram. (5.) Dla każdego wiersza i (6.) każdej kolumny tablicy: (7.) numer wiersza w kolumnie i (8.) przepisz odpowiedni znak z szyfrogramu do tekstu wynikowego. Na koniec (11.) dopisz znak końca danych i (12.) zwróć szyfrogram.

Testowanie funkcji

W celu przetestowania danych można skorzystać z poniższej funkcji main(). Program wczyta dane oraz wypisze szyfrogram i rozszyfruje go.

  1. int main() {
  2.   int kluczN;
  3.   cout << "Podaj rozmiar klucza N:";
  4.   cin >> kluczN;
  5.   cout << "Podaj klucz (" << kluczN*kluczN << " liczb)\n";
  6.   int* klucz = new int[kluczN*kluczN];
  7.   for (int i = 0; i < kluczN*kluczN; i++)
  8.     cin >> klucz[i];
  9.   cout << "Podaj tekst jawny:\n";
  10.   char* txt = new char[512];
  11.   cin.ignore();
  12.   cin.getline(txt, 512);
  13.   char* txtz = szyfruj(txt, klucz, kluczN);
  14.   cout << "Szyfrogram to:\n" << txtz;
  15.   char* txtr = rozszyfruj(txtz, klucz, kluczN);
  16.   cout << "\nTekst jawny to:\n" << txtr;
  17.   delete txt, txtz, txtr;
  18.   system("pause");
  19.   return 0;
  20. }

Zadania

Zadanie 1

Dopisz do programu funkcję sprawdzKlucz(), która sprawdzi czy wprowadzony klucz jest poprawny. Jeśli nie to funkcja szyfrująca/deszyfrująca powinna wypisać na ekran odpowiedni komunikat.