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:
1 | K | A | C | Z | O | R |
---|---|---|---|---|---|---|
2 | L | B | D | P | S | |
3 | M | E | Q | T | ||
4 | N | F | U | |||
5 | G | V | ||||
6 | H | W | ||||
7 | I | X | ||||
8 | J | Y |
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ę.
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.
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.
(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.
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:
(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.
Poniższa funkcja main() pozwala przetestować napisany kod.
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:
otrzymujemy: