Szyfr Zmiennik nie posiada typowego klucza do szyfrowania. Rolę klucza odgrywa tutaj tabelka wypełniona znakami. Jej wielkość i zawartość są dowolne. Kiedy chcemy zaszyfrować tekst sprawdzamy czy dany znak znajduje się w tabelce. Jeśli tak to bierzemy znak stojący kolumnę wcześniej. Jeśli znak znajduje się w pierwszej kolumnie to żądany znak bierzemy z ostatniej kolumny.
Przykładowo stwórzmy taką tabelkę:
Teraz chcąc zaszyfrować słowo "INFORMACJA" szyfrujemy kolejno: I na E, N na J, F na B, O na K, R na M, M na I, A na W (A jest w pierwszej kolumnie, więc znak po lewej bierzemy z ostatniej kolumny), C na Y, J na F, A na W i otrzymujemy zaszyfrowany tekst: EJBKMIWYFW.
W przypadku deszyfrowania znajdujemy literkę z tekstu zaszyfrowanego w tabelce i odczytujemy znak po prawej stronie. Analogicznie przy szyfrowaniu jeśli znak jest w ostatniej kolumnie to znak pobieramy z pierwszej.
Program otrzyma na wejściu dwie wartości w, h całkowitoliczbowe, które określą wielkość tablicy szyfrującej. Potem w h linijkach będzie w znaków porozdzielanych spacjami. W następnej linijce po tablicy będzie wprowadzony tekst do zaszyfrowania. Na wyjściu ma zostać wypisany zaszyfrowany tekst zgodnie z szyfrem zmiennik. Przykładowo dla wejścia:
otrzymamy:
Funkcja szyfrująca przyjmie cztery argumenty: tekst do zaszyfrowania, tablicę, która będzie dwuwymiarową tablicą typu char oraz szerokość i wysokość tabelki. Wynikiem działania funkcji będzie zaszyfrowany tekst.
(2.) Alokujemy pamięć pod wynik. (3.) Dla każdego znaku w tekście (4.) wywołamy funkcję getLeftCharFromTable(), która zwróci odpowiedni znak z tablicy. (5.) Dopisujemy na koniec znak końca napisu \0 i (6.) zwracamy wynik.
Funkcja getLeftCharFromTable() przyjmuje cztery argumenty: szukany znak, tablicę znaków oraz szerokość i wysokość tablicy. Wynikiem będzie znak. Jeśli szukany znak zostanie znaleziony to zwracamy nowy znak. Jeśli szukany znak nie występuje w tablicy to zwracamy znak, którego szukaliśmy.
(2.) W każdej linijce i (3.) dla każdego znaku w przeszukiwanym wierszu (4.) sprawdzamy czy na pozycji x, y występuje szukany znak: jeśli tak to (5.) zwracamy odpowiedni znak z tablicy. Należy tu pamiętać o przypadku, gdy szukany znak jest w pierwszej kolumnie, ponieważ wtedy potrzebujemy zwrócić z ostatniej kolumny, ponieważ kolumna "0" nie istnieje. Jeśli po wszystkie pętle zostaną ukończone to znaczy, że dany znak nie występuje w tablicy, więc zwracamy szukany znak.
Deszyfrowanie opiera się na tej samej zasadzie co szyfrowanie. Różnica tkwi tutaj, który znak z tablicy jest zwracany. Kod pozostawiam do własnego przemyślenia:
Poniższa funkcja main() pozwala na wczytanie danych zgodnie z założeniami. Wczytany tekst najpierw szyfruje, a potem rozszyfruje na podstawie klucza i szyfrogramuu.
Funkcję szyfrowania i deszyfrowania można napisać jako nie cztery, a tylko dwie funkcje jeśli będziemy przekazywać argument o ile przesuwamy indeks znaku w każdym wierszu.
Funkcja cipher() i decipher() były identyczne, dlatego możemy z nich zrobić jedną. Jednak potrzebny jest kolejny argument przes, który określi czy dane mają być zaszyfrowane czy rozszyfrowane.
Funkcja getLeftCharFromTable() oraz getRightCharFromTable() też mają identyczną strukturę prócz linijki (5.). Mając teraz dodatkowy argument przes będziemy przyjmować odpowiednie wartości, które wystarczy zastąpić -1 i +1 w dotychczasowych funkcjach:
Od teraz szyfrować będziemy przy pomocy:
a jeśli będziemy chcieli odszyfrować to wystarczy wpisać:
Zmodyfikuj funkcję, aby na wejściu przed wszystkimi innymi danymi wejściowymi program powinien wczytać rozmiar jednego bloku - innymi słowy każdy blok nie będzie się składał z 10 znaków, a dowolnej ilości.
Przykładowo dla danych: