Szyfr Ragbaby to szyfr podstawieniowy, który na podstawie pozycji danego znaku zamienia go na inny znak z alfabetu. Wyróżnia go sposób obliczania znaku, który powinien zastąpić szyfrowane dane. Liczy się nie pozycja w tekście, a pozycja w wyrazie i pozycja wyrazu.
Do zaszyfrowania danych potrzebne jest słowo kluczowe na którego podstawie zostanie utworzony klucz. W celu utworzenia klucza należy pobrać wszystike pierwsze wystąpienia danej litery z słowa kluczowego, a następnie pozostaje uzupełnić klucz nie występującymi w nim jeszcze znakami z wybranego alfabetu. Zazwyczaj przyjmuje się, że dodatkowe znaki bierze się z alfabetu łacińskiego, ale można np. też z alfabetu łacińskiego rozszerzonego o cyfry arabskie.
Następnie każdy znak zastępujemy przy pomocy klucza. W celu wyliczenia, który znak zastąp i-ty znak tekstu jawnego należy zsumować w którym wyrazie znajduje się znak (wyrazy indeksujemy od 0), pozycję znaku w danym wyrazie oraz pozycję szyfrowanego znaku w kluczu. Potem wyliczona wartość wskazuje na znak z klucza, który powinien zostać wybrany w sposób cykliczny.
Spróbujmy zaszyfrować wyrażenie "TAJNA INFORMACJA" przy pomocy klucza "HASLO". Pierwszy etap polega na utworzeniu klucza. W tym przypadku żaden znak się nie powtarza, więc na koniec są jedynie pozostałe znaki z alfabetu. W ten sposób powstaje następujący klucz:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
H | A | S | L | O | B | C | D | E | F | G | I | J | K | M | N | P | Q | R | T | U | V | W | X | Y | Z |
Teraz można przejść do szyfrowania danych. Dla każdego znaku zapiszmy w którym wyrazie się znajduje, pozycję danego znaku w wyrazie w którym się znajduje oraz pozycję szyfrowanego znaku w alfabecie.
Znak | T | A | J | N | A | I | N | F | O | R | M | A | C | J | A | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Wyraz | 0 | 0 | 0 | 0 | 0 | - | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Pozycja | 1 | 2 | 3 | 4 | 5 | - | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
Alfabet | 19 | 1 | 12 | 15 | 1 | - | 11 | 15 | 9 | 4 | 18 | 14 | 1 | 6 | 12 | 1 |
Teraz sumujemy te dane i dzielimy przez długość alfabetu. Reszta z dzielenia wskaże, który znak z alfabetu mamy zapisać do szyfrogramu:
Znak | T | A | J | N | A | I | N | F | O | R | M | A | C | J | A | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Suma | 20 | 3 | 15 | 19 | 6 | - | 13 | 18 | 13 | 9 | 24 | 21 | 9 | 15 | 22 | 12 |
Szyfrogram | U | L | N | T | C | K | R | K | F | Y | V | F | N | W | J |
Ostateczny szyfrogram to: "ULNTC KRKFYVFNWJ". W celu rozszyfrowania danych należy dla każdego znaku obliczyć sumę pozycji znaku w wyrazie oraz numer wyrazu i o tyle pozycji przesunąć w lewo w alfabecie dany znak.
Przedstawiona implementacja potrafi utworzyć klucz na podstawie podanego słowa klucza uzupełniając znakami z alfabetu łacińskiego. Ponadto w programie przyjmuje się, że wyrazy rodziela znak przerwy (spacja) oraz poprawność danych wejściowych.
Funkcja utworzKlucz() tworzy na podstawie argumentu dane - słowa kluczowego oraz alfabetu łacińskiego klucz.
(2.) Tworzymy nową zmienną i (3. - 5.) przepisujemy unikalne litery z podanego słowa dane, następnie (6. - 8.) dopisujemy pozostałe znaki z alfabetu. Na koniec (9.) zwracamy utworzony klucz.
Funkcja szyfruj przyjmuje dwa argumenty: klucz - słowo klucz potrzebne do utworzenia alfabetu oraz tekst - tekst jawny do zaszyfrowania. Wynikiem działania funkcji jest szyfrogram.
(2.) Tworzymy klucz użyty do szyfrowania i inicjalizujemy zmienną do zapisu wyniku. Następnie ustalamy, że pierwszy znak (4.) pochodzi z pierwszego wyrazu i (5.) jego numer to 1. Potem (6.) dla każdego znaku: (7.) sprawdzamy czy jest znakiem spacji. Jeśli tak to (8.) przepisujemy go, (9.) zwiększamy numer wyrazu o jeden i (10.) ustalamy przesunięcie dla pierwszego znaku w tym wyrazie. Jednak dla znaku z klucza: (12.) obliczamy przesunięcie, (13.) wybieramy odpowiedni znak i (14.) zwiększamy wielkość przesunięcia. Na koniec (17.) zwracamy wynik.
Funkcja szyfruj przyjmuje dwa argumenty: klucz - słowo klucz potrzebne do utworzenia alfabetu oraz tekst - tekst jawny do zaszyfrowania. Wynikiem działania funkcji jest szyfrogram.
(12.) W funkcji rozszyfrowywującej zmienia się jedynie znak w którą stronę przesuwamy się w alfabecie.
Napisane funkcje szyfrujące i rozszyfrujące można przetestować przy pomocy poniższego fragmentu kodu:
Napisz program, który za słowo będzie uznawał ciąg znaków wystepujących w kluczu, które są rodzielone przez znaki nie występujace w kluczu. Alfabet rozszerz o cyfry arabski od 0 do 9 i niech zostaną ustawione rosnąco po literze 'Z'. Przetestuj działanie programu.
Przykładowo teraz zaszyfrowane wyrażenie "TAJNE, ZE AZ STRACH!" szyfrowane kluczem "HASLO123" zwróci szyfrogram: