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

Szyfr Ragbaby

Opis szyfru

Szyfr Ragbaby to szyfr podstawieniowy, który na podstawie pozycji danego znaku zamienia go na inny znak z alfabetu. Wyróżnia go sposób obliczania znaku, który powinien zastąpić szyfrowane dane. Liczy się nie pozycja w tekście, a pozycja w wyrazie i pozycja wyrazu.

Zasada szyfrowania

Do zaszyfrowania danych potrzebne jest słowo kluczowe na którego podstawie zostanie utworzony klucz. W celu utworzenia klucza należy pobrać wszystike pierwsze wystąpienia danej litery z słowa kluczowego, a następnie pozostaje uzupełnić klucz nie występującymi w nim jeszcze znakami z wybranego alfabetu. Zazwyczaj przyjmuje się, że dodatkowe znaki bierze się z alfabetu łacińskiego, ale można np. też z alfabetu łacińskiego rozszerzonego o cyfry arabskie.

Następnie każdy znak zastępujemy przy pomocy klucza. W celu wyliczenia, który znak zastąp i-ty znak tekstu jawnego należy zsumować w którym wyrazie znajduje się znak (wyrazy indeksujemy od 0), pozycję znaku w danym wyrazie oraz pozycję szyfrowanego znaku w kluczu. Potem wyliczona wartość wskazuje na znak z klucza, który powinien zostać wybrany w sposób cykliczny.

Przykład

Spróbujmy zaszyfrować wyrażenie "TAJNA INFORMACJA" przy pomocy klucza "HASLO". Pierwszy etap polega na utworzeniu klucza. W tym przypadku żaden znak się nie powtarza, więc na koniec są jedynie pozostałe znaki z alfabetu. W ten sposób powstaje następujący klucz:

012345678910111213141516171819202122232425
HASLOBCDEFGIJKMNPQRTUVWXYZ

Teraz można przejść do szyfrowania danych. Dla każdego znaku zapiszmy w którym wyrazie się znajduje, pozycję danego znaku w wyrazie w którym się znajduje oraz pozycję szyfrowanego znaku w alfabecie.

ZnakTAJNA INFORMACJA
Wyraz00000-1111111111
Pozycja12345-12345678910
Alfabet19112151-111594181416121

Teraz sumujemy te dane i dzielimy przez długość alfabetu. Reszta z dzielenia wskaże, który znak z alfabetu mamy zapisać do szyfrogramu:

ZnakTAJNA INFORMACJA
Suma20315196-131813924219152212
SzyfrogramULNTC KRKFYVFNWJ

Ostateczny szyfrogram to: "ULNTC KRKFYVFNWJ". W celu rozszyfrowania danych należy dla każdego znaku obliczyć sumę pozycji znaku w wyrazie oraz numer wyrazu i o tyle pozycji przesunąć w lewo w alfabecie dany znak.

Implementacja

Założenia

Przedstawiona implementacja potrafi utworzyć klucz na podstawie podanego słowa klucza uzupełniając znakami z alfabetu łacińskiego. Ponadto w programie przyjmuje się, że wyrazy rodziela znak przerwy (spacja) oraz poprawność danych wejściowych.

Tworzenie klucza

Funkcja utworzKlucz() tworzy na podstawie argumentu dane - słowa kluczowego oraz alfabetu łacińskiego klucz.

C++
C#
  1. string utworzKlucz(string dane) {
  2.   string klucz = "";
  3.   for (int i = 0; i < dane.length(); i++)
  4.     if (klucz.find(dane[i]) == string::npos)
  5.       klucz += dane[i];
  6.   for (char i = 'A'; i <= 'Z'; i++)
  7.     if (klucz.find(i) == string::npos)
  8.       klucz += i;
  9.   return klucz;
  10. }

(2.) Tworzymy nową zmienną i (3. - 5.) przepisujemy unikalne litery z podanego słowa dane, następnie (6. - 8.) dopisujemy pozostałe znaki z alfabetu. Na koniec (9.) zwracamy utworzony klucz.

Szyfrowanie

Funkcja szyfruj przyjmuje dwa argumenty: klucz - słowo klucz potrzebne do utworzenia alfabetu oraz tekst - tekst jawny do zaszyfrowania. Wynikiem działania funkcji jest szyfrogram.

C++
C#
  1. string szyfruj(string tekst, string klucz) {
  2.   string alfabet = utworzKlucz(klucz);
  3.   string w = "";
  4.   int wyraz = 1;
  5.   int numer = 1;
  6.   for (int i = 0; i < tekst.length(); i++) {
  7.     if (tekst[i] == ' ') {
  8.       w += ' ';
  9.       wyraz++;
  10.       numer = wyraz;
  11.     } else {
  12.       int poz = (alfabet.find(tekst[i]) + numer);
  13.       w += alfabet[poz % (alfabet.length())];
  14.       numer++;
  15.     }
  16.   }
  17.   return w;
  18. }

(2.) Tworzymy klucz użyty do szyfrowania i inicjalizujemy zmienną do zapisu wyniku. Następnie ustalamy, że pierwszy znak (4.) pochodzi z pierwszego wyrazu i (5.) jego numer to 1. Potem (6.) dla każdego znaku: (7.) sprawdzamy czy jest znakiem spacji. Jeśli tak to (8.) przepisujemy go, (9.) zwiększamy numer wyrazu o jeden i (10.) ustalamy przesunięcie dla pierwszego znaku w tym wyrazie. Jednak dla znaku z klucza: (12.) obliczamy przesunięcie, (13.) wybieramy odpowiedni znak i (14.) zwiększamy wielkość przesunięcia. Na koniec (17.) zwracamy wynik.

Deszyfrowanie

Funkcja szyfruj przyjmuje dwa argumenty: klucz - słowo klucz potrzebne do utworzenia alfabetu oraz tekst - tekst jawny do zaszyfrowania. Wynikiem działania funkcji jest szyfrogram.

C++
C#
  1. string rozszyfruj(string tekst, string klucz) {
  2.   string alfabet = utworzKlucz(klucz);
  3.   string w = "";
  4.   int wyraz = 1;
  5.   int numer = 1;
  6.   for (int i = 0; i < tekst.length(); i++) {
  7.     if (tekst[i] == ' ') {
  8.       w += ' ';
  9.       wyraz++;
  10.       numer = wyraz;
  11.     } else {
  12.       int poz = (alfabet.find(tekst[i]) - numer + alfabet.length());
  13.       w += alfabet[poz % (alfabet.length())];
  14.       numer++;
  15.     }
  16.   }
  17.   return w;
  18. }

(12.) W funkcji rozszyfrowywującej zmienia się jedynie znak w którą stronę przesuwamy się w alfabecie.

Testowanie funkcji

Napisane funkcje szyfrujące i rozszyfrujące można przetestować przy pomocy poniższego fragmentu kodu:

C++
C#
  1. int main() {
  2.   string klucz, tekst;
  3.   cout << "Podaj slowo klucz:\n";
  4.   cin >> klucz;
  5.   cout << "Podaj tekst do zaszyfrowania\n";
  6.   cin.ignore();
  7.   getline(cin, tekst);
  8.   string szyfrogram = szyfruj(tekst, klucz);
  9.   cout << "\nZaszyfrowany tekst:\n" << szyfrogram;
  10.   string tekstJawny = rozszyfruj(szyfrogram, klucz);
  11.   cout << "\nRozszyfrowany tekst:\n" << tekstJawny;
  12.   system("pause");
  13.   return 0;
  14. }

Zadania

Zadanie 1

Napisz program, który za słowo będzie uznawał ciąg znaków wystepujących w kluczu, które są rodzielone przez znaki nie występujace w kluczu. Alfabet rozszerz o cyfry arabski od 0 do 9 i niech zostaną ustawione rosnąco po literze 'Z'. Przetestuj działanie programu.

Przykładowo teraz zaszyfrowane wyrażenie "TAJNE, ZE AZ STRACH!" szyfrowane kluczem "HASLO123" zwróci szyfrogram:

  1. ULNTK, 4I 06 2YYBMC!