Strona główna » Algorytmy » Szyfry » Szyfr Pofragmentowany tekst
 

Szyfr Pofragmentowany tekst

Wstęp

Szyfr polega na specjalnym przestawieniu liter. Do szyfrowania potrzebny jest klucz n, który jest liczbą całkowitą, dodatnią. Klucz określa ile liter znajduje się w grupie. Innymi słowy podczas szyfrowania otrzymujemy x grup, gdzie x to wynik podzielenia długości tekstu przez n. (Wynik oczywiście należy zaokrąglić w górę.) Podczas szyfrowania pierwszą literę wstawiamy do pierwszej grupy, drugą literę do drugiej grupy ... x-tą literę do x-tej grupy, a litera o indeksie x + 1 trafi do pierwszej grupy itd... Znaki wrzucamy dopóki pozostały jakiekolwiek litery. Następnie kolejno litery z każdej grupy zapisuje się koło siebie. Szyfrogram jest gotowy.

Przykład 1

Przykładowo szyfrując tekst TAJNA INFORMACJA i kluczem n = 3 to na początek wyliczamy ile jest grup: . Czyli należy utworzyć 6 grup po 3 litery. Oczywiście niektóry grupy nie będą zapełnione całkowicie. Wolne miejsca zostaną wypełnione spacją. Rozmieszczenie liter w każdej grupie wygląda następująco:

Grupa 1Grupa 2Grupa 3Grupa 4Grupa 5Grupa 6
T, I, AA, N, CJ, F, JN, O, AA, R, __, M, _
Znaki spacji zostały zastąpione przy pomocy podkreślnika

Zaszyfrowany tekst ma postać: "TIAANCJFJNOAAR  M ". Chcąc rozszyfrować wystarczy podzielić zaszyfrowany tekst z powrotem na grupy po n elementów, a następnie wykonać n pętli i w i-tej iteracji odczytać wszystkie i-te element z każdej grupy.

Przykład 2

Przykładowo szyfrując tekst INFORMACJA i kluczem n = 4 to na początek wyliczamy ile jest grup: . Czyli należy utworzyć 3 grupy po 4 litery. Grupy wyglądają następująco:

Grupa 1Grupa 2Grupa 3
I, O, A, AN, R, C, _F, M, J, _
Znaki spacji zostały zastąpione przy pomocy podkreślnika

Zaszyfrowany tekst ma postać: "IOAANRC FMJ ".

Implementacja

Szyfrowanie

Podczas szyfrowania należy pamiętać, że dla pewnego tekstu o długości l i klucza n potrzebne będzie n·x pozycji, gdzie . Oczywiście nie należy twierdzić, że w takim razie będzie potrzebne tylko l pozycji, bo !

  1. char* cipher(char* txt, int n){
  2.   int x = ceil((double)strlen(txt) / (double)n);
  3.   int dl = n * x;
  4.   char* wynik = new char[dl + 1];
  5.   for(int i = 0; i < dl; i++){
  6.     wynik[(i % x) * n + i / x] = (i < strlen(txt)) ? txt[i] : ' ';
  7.   }
  8.   wynik[dl] = '\0';
  9.   return wynik;
  10. }

(2.) Wyliczenie ile będzie grup. (3.) Wyliczenie długości tekstu zaszyfrowanego. (4.) Alokacja pamięci pod szyfrogram. (5.) Dla każdego pozycji: (6.) wybranie odpowiedniego znaku i zapisanie na odpowiedniej pozycji. Wskazówka: Można zapobiec porównywaniu w każdej iteracji rozpisując pętle na dwie pętle (jedna przepisuje znaki, a druga dopisuje znaki spacji na wolnych pozycjach). (8.) Dopisanie znaku końca danych i (9.) zwrócenie wyniku.

Deszyfrowanie

Jak w większości szyfrów deszyfrowanie jest znacznie prostsze: wystarczy tylko poprzestawiać znaki z powrotem:

  1. char* decipher(char* txt, int n){
  2.   int x = ceil((double)strlen(txt) / (double)n);
  3.   int dl = strlen(txt);
  4.   char* wynik = new char[dl + 1];
  5.   for(int i = 0; i < dl; i++){
  6.     wynik[i] = txt[(i % x) * n + i / x];
  7.   }
  8.   wynik[dl] = '\0';
  9.   return wynik;
  10. }

(2.) Wyliczenie ile będzie grup. (3.) Ustalenie długości wyniku. (4.) Alokacja pamięci pod tekst niezaszyfrowany. (5.) Dla każdego pozycji: (6.) wybranie odpowiedniego znaku i zapisanie na odpowiedniej pozycji. (8.) Dopisanie znaku końca danych i (9.) zwrócenie wyniku.

Testowanie funkcji

Funkcja można przetestować przy pomocy poniższej funkcji:

  1. int main () {
  2.   char* txt = new char[128];
  3.   cin.getline(txt, 128);
  4.   int n;
  5.   cin >> n;
  6.   char* txtc = cipher(txt, n);
  7.   cout << txtc << endl;
  8.   char* txtd = decipher(txtc, n);
  9.   cout << txtd << endl;
  10.   delete[] txt, txtc, txtd;
  11.   system("pause");
  12.   return 0;
  13. }

W pierwszej linijce należy podać tekst do zaszyfrowania, a w drugiej klucz n. Przykładowo:

  1. PROSTY TEST
  2. 3

zostanie zwrócone:

  1. PTERYSO TST

Zadania

Zadanie 1

Napisz program, który do szyfrowanie przyjmie dodatkowy klucz k, który określi o ile pozycji w alfabecie ma być przesunięty i-ty znak. Wskazówka: zamiana tak jak w Szyfrze Cezara

Przykładowo dla danych:

  1. PROSTY TEST
  2. 3 10

otrzymujemy:

  1. ZDOBICY DCD