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

Szyfr Karpaty

O szyfrze

Przed zaszyfrowaniem danych ustalamy klucz według którego będziemy szyfrować. Przykładowo jest to tytułowa nazwa szyfru - KARPATY. Szyfrowanie polega doklejeniu do każdej litery tekstu jawnego kolejnej litery klucza. W ten sposób powstaje szyfrogram. W przypadku, gdy tekst jawny jest dłuższy niż klucz to po ostatniej literce klucza zaczynamy brać literki klucza od początku. W celu odczytania ukrytej wiadomości wystarczy odczytać co drugą literę tekstu zaszyfrowanego.

Weźmy przykładowo teraz tekst jawny INFORMACJA oraz klucz KARPATY. Rozrysujmy teraz tabelkę, aby łatwiej było zrozumieć metodę szyfrowania.

Tekst jawnyINFORMACJA
Literka z kluczaKARPATYKAR
Powstała paraIKNAFROPRAMTAYCKJAAR

Odczytując kolejne powstałe pary odczytujemy szyfrogram: IKNAFROPRAMTAYCKJAAR.

Implementacja

Założenia

Klucz można ustalić dowolny, dlatego napiszemy teraz funkcję, która na wejściu otrzyma dwie linijki tekstu. W pierwszej linijce tekstu będzie tekst jawny do zaszyfrowania, a w drugiej będzie słowo klucz ( albo i nawet całe zdanie klucz!). Na wyjście powinien zostać wypisany tekst zaszyfrowany zgodnie z szyfrem Karpaty.

  1. TAJNA INFORMACJA
  2. HASLO

otrzymamy szyfrogram:

  1. THAAJSNLAO HIANSFLOORHMAASCLJOAH

Szyfrowanie

Przed rozpoczęciem szyfrowania należy zauważyć, że teksty wynikowy jest dwa razy dłuższy od tekstu jawnego, ostatnią literą w szyfrogramie jest litera z klucza.

  1. char* cipher(const char* txt, const char* code){
  2.   int dl = strlen(txt) * 2;
  3.   char* wynik = new char[dl];
  4.   for(int i = 0; txt[i - 1]; i++){
  5.     wynik[2*i] = txt[i];
  6.     wynik[2*i+1] = code[i%strlen(code)];
  7.   }
  8.   return wynik;
  9. }

(1.) Będziemy zwracać tablicę znaków char* na podstawie argumentów txt - tekst do zaszyfrowania oraz code - wyrażenie klucz. (2.) Wyliczamy długość szyfrogramu. (3.) Alokujemy pamięć pod tekst wynikowy. (4.) Dla każdego znaku w tekście jawnym txt (razem ze znakiem końca danych \0): (5.) Na pozycję parzystą przepisujemy kolejną literę tekstu jawnego oraz (6.) kolejną literę z klucza. Używamy tu funkcji modulo %, aby nie wyjść poza zakres tablicy code. Po wszystkich iteracjach (8.) zwracamy wynik.

Deszyfrowanie

Deszyfrowanie polega na odczytaniu co drugiej literki, dlatego funkcja deszyfrująca będzie przyjmowała tylko argument txt - tekst do rozszyfrowania:

  1. char* decipher(const char* txt){
  2.   int dl = strlen(txt) / 2;
  3.   char* wynik = new char[dl];
  4.   for(int i = 0; txt[2*(i - 1)]; i++)
  5.     wynik[i] = txt[2*i];
  6.   return wynik;
  7. }

(2.) Wyliczamy długość tekstu jawnego. (3.) Alokujemy pamięć pod tekst wynikowy. (4.) Dla co drugiego znaku w szyfrogramie (5.) przepisujemy na kolejne pozycję w tablicy wynikowej. (5.) 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* code = new char[128];
  5.   cin.getline(code, 128);
  6.   char* txtc = cipher(txt, code);
  7.   cout << txtc << endl;
  8.   char* txtd = decipher(txtc);
  9.   cout << txtd << endl;
  10.   delete[] txt, txtc, txtd;
  11.   system("pause");
  12.   return 0;
  13. }

Zadania

Zadanie 1

Zmodyfikuj funkcję szyfrującą, aby wszystkie małe znaki alfabetu łacińskiego były dużymi. Nie wolno modyfikować tekstu wejściowego oraz nagłówka funkcji cipher().

Po podaniu poniższych danych:

  1. Tajna informacja
  2. HaSlO

program powinien wypisać następujący szyfrogram:

  1. THAAJSNLAO HIANSFLOORHMAASCLJOAH