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

Szyfr Kaczor

Sposób szyfrowania

Szyfr Kaczor polega na zastąpieniu każdej litery przy pomocy pary znak liczba. Para jest to nagłówek kolumny (pojedyncza litera), a liczba to numer wiersza, gdzie znajduje się szyfrowany znak w tabelce. Należy pamiętać, że liczba niekoniecznie musi być jednocyfrowa! Standardowo szyfrowanie odbywa się według poniższej tabelki:

1KACZOR
2LBDPS
3MEQT
4NFU
5GV
6HW
7IX
8JY

Przykładowo szyfrując słowo INFORMACJA. Pierwszą literę I zastąpimy przy pomocy C7, N przez K4, a literę F przy pomocy C4. Ostatecznie zaszyfrowany wyraz INFORMACJA będzie miał postać C7K4C4O1R1K3A1C1C8A1.

W przypadku, gdy chcemy rozszyfrować zaszyfrowany tekst należy brać kolejne pary litery oraz liczby. Następnie w tabelce odszukać literę w pierwszym wierszu i w tej samej kolumnie wybrać wiersz wskazywany przez odczytaną liczbę.

Własna tabelka

Wyraz Kaczor użyty w tabelce można zastąpić dowolnym. W przypadku tworzenia własnej tabelki należy narysować tabelkę o n + 1 kolumnach, gdzie n to długość wybranego wyrazu. Następnie w każdej kolumnie dopisujemy pod spodem kolejne litery po literze z pierwszego wiersza dopóki kolejna litera nie występuje już w pierwszym wierszu. Czyli w przypadku analizy tworzenia tabelki na podstawie wzoru to w pierwszej kolumnie szyfru Kaczor jest K, L, M, N, ponieważ kolejna litera O już występuje w pierwszym wierszu.

Jeśli w wybranym wyrazie któraś z liter występuje więcej niż raz to pozwoli to na zwiększenie skuteczności szyfrowania - ten sam znak będzie można zapisać nie tylko na jeden sposób.

Implementacja

Szyfrowanie

W implementacji zastosujemy sztuczkę. Będzie ona polegała na sprytnym zapisaniu tabelki w postaci ciągu znaków. Każda para znaków oznacza zakres od do czyli zastępują pojedynczą kolumnę tabelki. Możemy też przyjąć, że nie musimy się przejmować dwucyfrowymi liczbami co znacząco ułatwi zadanie.

  1. char* cipher(const char* txt){
  2.   char code[] = "ABCJKNOQRYZZ";
  3.   char* wynik = new char[2*strlen(txt) + 1];
  4.   for(int i = 0; txt[i]; i++){
  5.     int j = 0;
  6.     while (txt[i] < code[j] || txt[i] > code[j + 1]){
  7.       j += 2;
  8.     }
  9.     wynik[2*i] = code[j];
  10.     wynik[2*i+1] = txt[i] - code[j] + '1';
  11.   }
  12.   wynik[2*strlen(txt)] = '\0';
  13.   return wynik;
  14. }

(2.) W zmiennej code przechowamy wyraz, który jest odpowiednikiem tabelki szyfru Kaczora. (3.) Alokujemy pamięć pod tekst wynikowy. Zaszyfrowany tekst będzie dwa razy dłuższy. (4.) Dla każdego znaku w podanym argumencie txt: (5.) Deklarujemy zmienną pomocniczą j. (6. - 8.) Przeszukujemy kolejne pary liter z code i sprawdzamy do którego zakresu należy i-ta litera z txt. (9.) Znak w wyniku zapisujemy jako pierwszą literę ze znalezionego zakresu oraz (10.) różnicy pomiędzy i-tą literą, a pierwszym znakiem zakresu. Po pętli (12.) uzupełniamy wynik znakiem \0 i (13.) zwracamy zaszyfrowany tekst.

Deszyfrowanie

Proces deszyfrowanie jest znacznie prostszy i nie wymaga znajomości tabelki. Bierzemy parę litera i następującą po niej liczbę, a następnie przesuwamy pobraną literę o liczbę. Funkcja deszyfrująca wygląda następująco:

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

(2.) Ustalamy długość tekstu wynikowego. (3.) Dla każdej pary znaków w zaszyfrowanym tekście: (4.) wyliczamy znak i go zapisujemy do wynik. Po pętli (6.) uzupełniamy wynik znakiem \0 i (7.) zwracamy zaszyfrowany tekst.

Testowanie funkcji

Poniższa funkcja main() pozwala przetestować napisany kod.

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

Zadania

Zadanie 1

Wywracamy do góry nogami zasady szyfru Kaczor. Przepisywaną literą do tekstu zaszyfrowanego będzie ostatni znak w kolumnie. Liczba pozostaje niezmieniona.

Przykładowo dla danych:

  1. INFORMACJA

otrzymujemy:

  1. J7N4J4Q1Y1N3B1J1J8B1