Szyfr Kodowana zamiana szyfruje poprzez zamianę odpowiednich par znaków na podstawie klucza. Klucz używany do szyfrowania to lista liczb dodatnich. (Istnieje możliwość dopuszczenia liczb ujemnych.) Szyfrowanie polega na tym, że dla każdego znaku jest wykonywana zamiana jego razem z znakiem położonym k pozycji dalej. k jest to i-ta liczba pobrana z klucza. W związku z tym, że pobierana wartość z klucza może nie istnieć to należy pobrać wtedy wartość k mod długość klucza. Podobnie należy postępować podczas zamiany, gdy nie istnieje pozycja i + k należy zamienić i-ty znak z i + k mod długość tekstu.
Przykładowo weźmy tekst INFORMACJA oraz klucz [1, 2, 3]. Wtedy kolejno należy dokonać następujących zamian:
Pozycja | Znak 1 | Klucz | Znak 2 | Po zamianie |
---|---|---|---|---|
- | - | - | - | INFORMACJA |
1 | I | 1 | N | NIFORMACJA |
2 | I | 2 | O | NOFIRMACJA |
3 | F | 3 | M | NOMIRFACJA |
4 | I | 1 | R | NOMRIFACJA |
5 | I | 2 | A | NOMRAFICJA |
6 | F | 3 | J | NOMRAJICFA |
7 | I | 1 | C | NOMRAJCIFA |
8 | I | 2 | A | NOMRAJCAFI |
9 | F | 3 | O | NFMRAJCAOI |
10 | I | 1 | N | IFMRAJCAON |
Po zaszyfrowaniu szyfrogram to: IFMRAJCAON.
Proces deszyfrowania jest odwrotnością procesu szyfrowania. Należy dokonać tych samych operacji zamian, ale zaczynają od ostatniego znaku:
Pozycja | Znak 1 | Klucz | Znak 2 | Po zamianie |
---|---|---|---|---|
10 | N | 1 | I | IFMRAJCAON |
9 | O | 3 | F | NFMRAJCAOI |
8 | A | 2 | I | NOMRAJCAFI |
7 | C | 1 | I | NOMRAJCIFA |
6 | J | 3 | F | NOMRAJICFA |
5 | A | 2 | I | NOMRAFICJA |
4 | R | 1 | I | NOMRIFACJA |
3 | M | 3 | F | NOMIRFACJA |
2 | O | 2 | I | NOFIRMACJA |
1 | N | 1 | I | NIFORMACJA |
- | - | - | - | INFORMACJA |
Tekst został prawidłowo rozszyfrowany: INFORMACJA.
Ze względu na fakt, że zamiana znaków przyda się podczas szyfrowania i deszyfrowania to warto napisać funkcję swapChar(), która przyjmie dwa wskaźniki i zamieni wartości znajdujące się pod tymi adresami:
Funkcja szyfrująca cipher() przyjmuje trzy argumenty: txt - tekst do zaszyfrowania, key - lista liczb klucza oraz keyl - długość klucza.
(2.) Pobierz długość tekstu. (3. - 5.) Skopiuj tekst do nowego miejsca w pamięci. (6.) Dla każdego kolejnego znaku: (7.) dokonaj odpowiedniej zamiany. (8.) Zwróć szyfrogram.
Funkcja deszyfrująca decipher() przyjmuje trzy argumenty: txt - tekst do rozszyfrowania, key - lista liczb klucza oraz keyl - długość klucza.
(2.) Pobierz długość tekstu. (3. - 5.) Skopiuj tekst do nowego miejsca w pamięci. (6.) Dla każdego kolejnego znaku: (7.) dokonaj odpowiedniej zamiany. Warto tutaj zwrócić uwagę na fakt, że podczas wyliczania znaku do zamiany może wyjść liczba ujemna, dlatego należy dodać długość tekstu do wyliczonej wartości i + k i pobrać resztę z dzielenie przez długość klucza. (8.) Zwróć tekst jawny.
Poniższa funkcja main() pozwala przetestować działanie programu. Na początku należy podać długość klucza, listę liczba oraz tekst do zaszyfrowania. Następnie program wypisze na ekran szyfrogram oraz tekst jawny uzyskane przy pomocy napisanych funkcji.
Zmodyfikuj kod źródłowy implementacji tak, aby można było wprowadzić do klucza zarówno wartości dodatnie jak i ujemne. Przykładowo dla słowa INFORMACJA oraz klucza [1 -2 3 -4] program powinien wypisać: