Szyfrowanie polega na zamianie każdej litera na parę znaków zgodnie z tabelką:
M | A | F | E | K | I | N | G | |
---|---|---|---|---|---|---|---|---|
1 | A | B | C | D | E | F | G | H |
2 | I | J | K | L | M | N | O | P |
3 | R | S | T | U | W | X | Y | Z |
W celu zaszyfrowania pojedynczego znaku należy odczytać nagłówek kolumny i wiersza, a następnie w tej kolejności zapisać w wynikowym tekście. Przykładowo kiedy chcemy zaszyfrować literę A zamieniamy ją na M1. Z kolei literę Z zaszyfrujemy jako G3. Podczas deszyfrowania należy pamiętać, aby brać kolejne dwa znaki i odczytać literę z tabelki: cyfra oznacza numer wiersza, a litera to nagłówek kolumny. Przykładowo zaszyfrowany tekst F3K1A3F3 to TEST.
Warto zauważyć, że standardowy alfabet łaciński składa się z 26 znaków przez co 2 znaki znajdują się poza tabelką. W przypadku szyfru Mafeking zostały usunięte litery Q oraz V.
Szyfrowanie polega na zamianie każdego znaku na dwa inne. Z tego powodu nie istnieje potrzeba pisania specjalnej części kodu do wyliczania tekstu wynikowgo. Należy jednak wziąć pod uwagę, aby prawidłowo usunąć litery Q i V z alfabetu.
(2.) Deklarujemy pomocniczą zmienną code i zapisujemy w niej klucz. Użyjemy jej do odczytywania nagłówka kolumny dla rozpatrywanego znaku. (3.) Wyliczamy długość tekstu wynikowego. W tym przypadku każdy znak to dwa inne, więc wystarczy podwoić długość txt. (4.) Alokujemy pamięć pod tekst wynikowy. (5.) Dla każdego znaku w txt: (6.) wyliczamy jego pozycję w alfabecie. W obliczeniach uwzględniamy przesunięciu spowodowane usunięciem Q i V. (7.) Pobieramy nagłówek kolumny z code i (8.) obliczamy nagłówek wiersza. Po wykonaniu pętli (10.) dopisujemy na końcu znak końca danych, (11.) zwracamy wynik.
Podczas deszyfrowania będziemy potrzebowali wyszukać literę w zmiennej code. Dzięki temu będziemy wiedzieć w której kolumnie leży zaszyfrowany znak. To zadanie realizuje funkcja pomocnicza findCharInList():
Z kolei właściwa funkcją deszyfrująca wygląda tak:
(2.) Przy deszyfrowaniu również użyjemy zmiennej pomocniczej code w której przechowamy nagłówki kolumn tabeli. (3.) Długość tekstu wynikowego będzie dwa razy mniejsza od wejściowego. (4.) Alokujemy pamięć pod tekst wynikowy. (5.) Dopóki nie przejrzymy wszystkich znaków txt: (6.) Wyliczamy zaszyfrowany znak. Nie uwzględniamy tu przesunięcia spowodowanego wycięciem dwóch liter. Robimy to w linijkach (7., 8.), gdzie zwiększamy odpowiedni znaki. (9.) Dopisujemy wyliczony znak na koniec wyniku. (11.) Dopisujemy na koniec \0, (12.) zwracamy wynik.
Funkcja main(), która przetestuje działanie programu wygląda następująco:
Napisz funkcję szyfrującą i deszyfrująca metodą Mafekinga, której działanie nie będzie polegało na deklarowaniu pomocniczej zmiennej code w której będzie przechowywany klucz MAFEKING. Wskazówka: użyj w tym celu np. instrukcji switch.