Szyfr dziesiątkowy polega na ukryciu znaków tekstu jawnego wśród losowych znaków. Ustalamy, że w każdych dziesięciu znakach ukryjemy n liczb. Ustalamy również pozycję znaków w każdej dziesiątce.
Działanie szyfrowania łatwiej wyjaśnić na konkretnym przykładzie: ustalmy, że szyfrujemy tekst "INFORMACJA". Decydujemy się ukryć po dwa znaki w każdej dziesiątce tekstu zaszyfrowanego na pozycjach 1 i 4. Tworzenie pierwszej dziesiątki wygląda tak:
Chociaż w wolne pola można wstawić dowolne znaki to nie warto dostawiać : " [ ) &, ponieważ pozwala to łatwiej określić, które znaki należy wybierać. Jeśli nasza wiadomość składa się tylko z dużych liter alfabetu łacińskiego to tylko je warto wykorzystywać do uzupełniania luk.
Proces deszyfrowania polega na wybraniu z każdej dziesiątki odpowiednie znaki i zapisaniu ich w kolejności w jakiej były wybierane z tekstu rozszyfrowywanego.
W celu uzyskania losowych znaków posłużymy się funkcja rand(), która jest dostępna po dodaniu bibliotek:
zainicjowania funkcji losującej przed użyciem, np.:
Zakładamy, że tekst do zaszyfrowania będzie złożony wyłącznie z dużych liter alfabetu łacińskiego. Na wejściu będzie podana liczba n, która będzie oznaczać ile znaków będzie w dziesiątce, a potem n liczb oznaczających na których pozycjach w każdej dziesiątce. W trzeciej linijce wejścia będzie podany tekst, którego długość nie będzie przekraczać 128 znaków. Na wyjście zostanie wypisany szyfrogram.
Funkcja szyfrująca przyjmuje trzy argumenty: ile znaków znajdzie się w każdej dziesiątce, tablice liczb całkowitych z pozycjami na których umieścimy znaki w każdej dziesiątce oraz tekst do zaszyfrowania.
(1.) Deklaracja funkcji i (2.) obliczenie długość tekstu wynikowego w celu zoptymalizowania wykorzystania pamięci. (3.) Alokujemy pamięć pod zaszyfrowany tekst. (4.) Dla każdego znaku w tekście wynikowym (5.) losujemy duży literę alfabetu łacińskiego.
(6.) Dla każdego znaku w tekście do zaszyfrowania (7.) wyliczamy miejsce dla i-tego znaku w tekście wynikowym i tam go umieszczamy. (8.) Na końcu tekstu umieszczamy znak specjalny \0 i (9.) zwracamy zaszyfrowany tekst.
Funkcja deszyfrująca przyjmie ile znaków jest w każdej dziesiątce i listę na jakich pozycjach oraz tekst do rozszyfrowania.
(1.) Deklarujemy funkcję i (2.) obliczamy długość tekstu wynikowego. (3.) Alokujemy pamięć pod tekst wynikowy. (4.) Dopisujemy na ostatniej pozycji znak końca linii \0. (5.) Dla każdego znaku w tekście wynikowym wyliczamy gdzie znajduje się w tekście do rozszyfrowania. Na koniec (7.) zwracamy wynik.
Funkcja main(), która przetestuje działanie programu wygląda następująco:
Przykładowo dla poniższych danych:
W podanych przykładach pogrubione znaki nie są losowane, a powstają wskutek faktycznego szyfrowania. Zostały wyróżnione jedynie w celu prezentacji ich pozycji.
Dostosuj kod źródłowy artykułu, aby:
Przykładowo dla danych:
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 wskazanej przez użytkownika.
Przykładowo dla danych: