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

Szyfr Wsteczny

O szyfrze

Szyfr wsteczny polega na zapisaniu wyrażenia odwrotnie, czyli: TAJNA INFORMACJA przechodzi na AJCAMROFNI ANJAT. Wiedząc, że użyliśmy szyfru wstecznego odczytamy zaszyfrowany tekst bez żadnego wysiłku. Jednak jeśli użyjemy go do szyfrowania razem z innym algorytmem ktoś może się zniechęcić, że kolejne odszyfrowane litery nie mają sensu.

Istnieje jeszcze druga odmiana tego szyfrowania, która polega na odwracaniu każdego wyrazu z osobna. Jest to metoda, która pozwoli na zwiększenie poziomu bezpieczeństwa, ale jednak wciąż bardzo łatwo odczytać szyfrowany tekst. Niemniej jest to szyfr bardzo ciekawy do zaprogramowania.

Zadanie 1

Założenia

Na wejściu otrzymujemy wyrażenie złożone ze spacji oraz małych liter alfabetu łacińskiego. Na wyjście powinno zostać wypisane wyrażenie wspak.

  1. INFORMACJA

otrzymamy:

  1. AJCAMROFNI

Szyfrowanie

Nasza funkcja będzie przyjmowała dwa argumenty: keyboard - ciag znaków opisujący jak wygląda znak oraz txt - tekst, który mamy zaszyfrować:

  1. char* backwards(const char* s){
  2.   int dl = strlen(s);
  3.   char* wynik = new char[dl + 1];
  4.   wynik[dl] = '\0';
  5.   for(int i = 0; s[i]; i++)
  6.     wynik[i] = s[dl-i-1];
  7.   return wynik;
  8. }

(1.) Jako argument przyjmuje tekst do odwrócenia. Nie chcemy go modyfikować, o czym świadczy const. Wynikiem funkcji będzie zaszyfrowany tekst typu char*. (2.) Pobieramy długość tekstu wynikowego. (3.) Alokujemy pamięć pod tekst wynikowy. (4.) Dopisujemy na koniec znak \0. (5.) Dla każdego znaku w tekście podanym jako argument s wykonujemy (6.) przepisanie znaków. (7.) Zwracamy wynik.

Deszyfrowanie

Deszyfrowanie to ponowne zaszyfrowanie. Nie potrzebujemy tu dodatkowej funkcji.

Zadanie 2

Założenia

Tym razem będziemy szyfrować drugą metodą - będzie zapisywać wspak każdy kolejny wyraz. W celu ułatwienia zadania przyjmujemy, że wyraz to ciąg znaków od a do z. Pomiędzy literami mogą występować dowolne znaki interpunkcyjne.

Szyfrowanie

  1. char* backwardsWords(const char* s){
  2.   int dl = strlen(s);
  3.   char* wynik = new char[dl + 1];
  4.   int from = 0, to = 0;

Rozpoczynamy szyfrowanie od (2.) wyliczenia długości tekstu wynikowego, (3.) alokacji pamięci pod tekst wynikowy oraz (4.) zadeklarowania zmiennych from, to. Użyjemy ich do przechowywania pierwszej i ostatniej litery każdego wyrazu.

  1.   while(s[to-1]!='\0'){
  2.     while(s[to]>='a'&&s[to]<='z')
  3.       to++;
  4.     for(int i = 0; from + i < to; i++)
  5.       wynik[from + i] = s[to - i - 1];
  6.     wynik[to]=s[to];
  7.     from = to + 1;
  8.     to++;
  9.   }

Wszystkie operacje wykonujemy (5.) dopóki nie natrafimy na znak końca tekstu \0. (6.) Dopóki aktualnie wskazywany znak przez zmienną to jest małą literą alfabetu łacińskiego to (7.) zwiększamy pozycje to. (8.) Dla każdego znaku prócz ostatniego znalezionego wykonujemy algorytm z metody szyfrowania zadania 1 - (9.) zmieniamy pozycję odpowiednich znaków. (10.) Znaku, który oddziela zakończył wyraz przepisujemy oddzielnie. (11.) Przyjmujemy, że następny wyraz zaczyna się pozycję dalej od znaku, który przerwał pętle w (6.). (12.) Zwiększamy pozycję to. W tym momencie zmienne from i to mają znowu te same wartości.

  1.   wynik[dl] = '\0';
  2.   return wynik;
  3. }

(14.) Dopisujemy znak końca danych na końcu wyniku i (15.) zwracamy wynik.

Testowanie funkcji

Funkcja main(), która przetestuje działanie programu wygląda następująco:

  1. int main () {
  2.   char* txt = new char[128];
  3.   cin.getline(txt, 128);
  4.   char* txtc = backwardsWords(txt);
  5.   cout << txtc << endl;
  6.   system("pause");
  7.   return 0;
  8. }

Zadania

Zadanie 1

Zmodyfikuj kod w (2.), aby wyraz mógł się składać z dużych i małych liter alfabetu łacińskiego.

Przykładowo dla danych:

  1. Tajna Informacja
otrzymujemy:
  1. anjaT ajcamrofnI

Zadanie 2

Wykorzystując dotychczasowe funkcje napisz funkcję change() do szyfrowania i deszyfrowania danych zgodnie z opisaną poniżej metodą szyfrowania:

Szyfrowanie polega na zapisaniu każdego wyrazu oddzielnie wspak, a następnie odwrócenia całego wyrażenia wspak.

Przykładowo dla danych:

  1. tajna informacja
otrzymujemy:
  1. informacja tajna