Szyfrowanie Przez Wybieranie to szyfr transpozycyjny, który do szyfrowania wymaga podania listy liczb. Ideą szyfru jest zabezpieczenie danych przy użyciu jedynie kartki papieru oraz ołówka. Jego zasada jest bardzo prosta i łatwo ją zapamiętać. Należy jednak pamiętać, że szyfrowane litery nie zostają zastąpione przez inne. Jego zaletą jest fakt, że pozwala szyfrować dowolny zestaw znaków.
Na początek należy ustalić tekst jawny oraz listę liczb potrzebną do szyfrowania danych. Następnie należy sprawdzić jaka jest długość tekstu jawnego i przygotować tyle samo pozycji do zapisania. Początkowo rozpoczynamy zapisywanie na indeksie 0. Wybierając kolejny znak do wstawienia wybieramy cyklicznie kolejną wartość z listy szyfrującej. Następnie zwiększamy indeks o 1 i zliczamy, która jest to wolna pozycja z kolei. Wykonujemy to tak długo, aż natrafimy na pozycję, która wynosi tyle co wybrana cyklicznie wartość z kodu. Proces ten jest powtarzany dla każdej kolejnej liczby.
Weźmy przykładowo tekst jawny "TAJNE DANE", a następnie zaszyfrujmy go kluczem {1, 2, 3, 4}. Wypełniany będzie tekst o długości n = 10:
Indeks | Znak | Klucz | Nowy Indeks | Tablica | Komentarz |
---|---|---|---|---|---|
0 | T | 1 | 0 | {T, _, _, _, _, _, _, _, _, _} | Pierwsza pozycja jest wolna, zastępujemy ją |
0 | A | 2 | 2 | {T, _, A, _, _, _, _, _, _, _} | |
2 | J | 3 | 5 | {T, _, A, _, _, J, _, _, _, _} | |
5 | N | 4 | 9 | {T, _, A, _, _, J, _, _, _, N} | |
9 | E | 1 | 1 | {T, E, A, _, _, J, _, _, _, N} | Po wyjściu z szyfrogramu, wracamy na początek |
1 | " " | 2 | 4 | {T, E, A, _, " ", J, _, _, _, N} | Litera 'A' nie jest liczona, więc dopiero pozycja 4 jest 2-gą wolną pozycją z kolei |
4 | D | 3 | 8 | {T, E, A, _, " ", J, _, _, D, N} | |
8 | A | 4 | 3 | {T, E, A, A, " ", J, _, _, D, N} | Poszukiwania 4 wolnej zpoycji wymusiły obejście szyfrogramu |
3 | N | 1 | 6 | {T, E, A, A, " ", J, N, _, D, N} | |
6 | E | 2 | 7 | {T, E, A, A, " ", J, N, E, D, N} | Ostatni znak można wpisać bez szukania |
Uzyskany szyfrogram to "TEAA JNEDN". W przypadku użycia klucza o większych wartościach istnieje szansa, aby litery z tego samego wyrazu były równomiernie rozłożone po całym szyfrogramie.
Proces wybierania pozycji można przyśpieszyć znając liczbę wolnych pozycji do zapełnienia. Przykłado wstawiając literą 'A' należało przejść przez szyfrogram dwa razy, ale można było tego uniknąć. Szukana była 4-ta wolna pozycja wśród 3 możliwych, więc wystarczyło szukać pozycji 4 mod 3 = 1-ej pozycji.
Funkcja szyfruj() wymaga podanie dwóch argumentów: tekst - tekst jawny do zaszyfrowania oraz klucz - lista liczb użyta do szyfrowania.
(2. - 5.) Przygotuj bufor pod wynik, a następnie (6.) dla każdego znaku z tekstu: (7.) pobierz wartość przesunięcia. (8. - 14.) W pętli wyszukaj k-tą wolną pozycję i (15.) zapisz tam wybrany znak. Na koniec (17.) zwróć bufor szyfrogram.
Funkcja odszyfruj() działa analogicznie do funkcji szyfrującej. Oto jej kod:
(2.) Przygotuj bufor pod wynik, a następnie (3.) dla każdego znaku z tekstu: (4.) pobierz wartość przesunięcia. (5. - 11.) W pętli wyszukaj k-tą wolną pozycję i (12.) pobierz wybrany znak i (13.) oznacz, że został już pobrany. Na koniec (15.) zwróć bufor wynik.
Poniższy fragment kodu wczytuje od użytkownika teskt do zaszyfrowania oraz listę liczb, które zostaną użyte jako klucz. Wypisany zostanie szyfrogram oraz rozszyfrowany tekst jawny.