Szyfr Morbid to szyfr podstawieniowy, który szyfruje przy pomocy klucza złożonego z cyfr tekst zapisany alfabetem Morse'a. W teorii przejście z liter na alfabet Morse'a i potem na cyfry zwiększa bezpieczeństwo danych, ale jest możliwe jego złamanie.
Przed szyfrowaniem należy ustalić słowo klucz złożone z 9 cyfr (albo innych różnych 9 znaków). Oznaczmy i-tą literę słowa przez si. Na podstawie podanego klucza tworzy się tabelkę szyfrujacą:
Klucz | s1 | s2 | s3 | s4 | s5 | s6 | s7 | s8 | s9 |
---|---|---|---|---|---|---|---|---|---|
Znak 1 | . | . | . | - | - | - | x | x | x |
Znak 2 | . | - | x | . | - | x | . | - | x |
Szyfrowanie polega najpierw na zakodowaniu wiadomości alfabetem Morse'a, a następnie wybieraniu kolejnych par znaków i dopasowania ich do tabeli. W celu dopasowanie pierwszy znak pary należy znaleźć w wierszu Znak 1, a drugi w wierszu Znak 2. Daną parę będzie szyfrować znak w wierszu Klucz w kolumnie w której znajduje się para. Pomiędzy każdym znakiem musi znaleźć się znak 'x', a pomiędzy każdym wyrazem wyrażenie 'xx'. Proces ten jest powtarzany dla każdej pary znaków.
W celu rozszyfrowania zaszyfrowanej wiadomości należy najpierw znaki zamienić zgodnie z tabelką na pary znaków, a dopiero później rozkodować alfabet Morse'a jeśli istnieje takowa potrzeba. Należy pamiętać, że pomiędzy znakami występuje dodatkowy znak 'x', a pomiędzy wyrazami 'xx'.
Niech szyfrowanym tekstem jawnym będzie wyrażenie "TAJNE DANE" przy pomocy klucza "928371456". Pierwszy krok polega na utworzeniu tabelki:
Klucz | 9 | 2 | 8 | 3 | 7 | 1 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|---|---|
Znak 1 | . | . | . | - | - | - | x | x | x |
Znak 2 | . | - | x | . | - | x | . | - | x |
Następnie należy zakodować tekst przy pomocy alfabetu Morse'a:
Klucz | T | A | J | N | E | D | A | N | E | |
---|---|---|---|---|---|---|---|---|---|---|
Morse | - | .- | .--- | -. | . | -.. | .- | -. | . |
Następnie pomiędzy każdą zamianę znaku na kod Morse'a należy wpisać 'x' i pogrupować dane w pary. Znak przerwy jest zamieniany na 'xx'. Każda para jest zamieniana na odpowiednią cyfrę zgodnie z tabelką utworzoną w pierszym kroku:
Morse | -x | .- | x. | -- | -x | -. | x. | xx | -. | .x | .- | x- | .x | .x |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Szyfrogram | 1 | 2 | 4 | 7 | 1 | 3 | 4 | 6 | 3 | 8 | 2 | 5 | 8 | 8 |
Ostateczny szyfrogram to "12471346382588". Można go roszyfrować wykonując opisane polecenia od końca.
Do projektu została dołączona biblioteka 'morse' oraz plik z alfabetem Morse'a z funkcjami, które zostały opisane w alfabecie na temat alfabetu Morse'a. Należą do nich:
W celu rozwiązania problemu z parami zobaczmy tworzoną tabelkę jeszcze raz, ale zamieńmy znak '.' na 0, znak '-' na 1, a znak 'x' na 2. Wtedy otrzymamy:
Klucz | s1 | s2 | s3 | s4 | s5 | s6 | s7 | s8 | s9 |
---|---|---|---|---|---|---|---|---|---|
Znak 1 | 0 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 |
Znak 2 | 0 | 1 | 2 | 0 | 1 | 2 | 0 | 1 | 2 |
Jeśli byśmy uznali, że pierwszy znak, a po nim drugi tworzą liczbę to byłyby to kolejne liczby z systemu trójkowego - i-ta kolumna miałaby wartość: wartość Znak 1 razy trzy plus wartość Znak 2. Wtedy:
Znak 1 | 0 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 |
---|---|---|---|---|---|---|---|---|---|
Znak 2 | 0 | 1 | 2 | 0 | 1 | 2 | 0 | 1 | 2 |
Wartość | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Wyliczoną wartość można wykorzystać do wybierania i-tego znaku z klucza (przyjmując indeksowanie od 0).
Funkcja szyfruj() przyjmuje dwa argumenty: data - oryginalny tekst do zaszyfrowania oraz code - kod szyfrujący dane. Wynikiem działania funkcji jest szyfrogram.
Najpierw (2. - 10.) tekst jest zamieniany na kod Morse'a i (11. - 12.) dopisywany jest znak 'x' jeśli długość danych do zaszyfrowania jest niaprzysta(inaczej możliwa jest utrata jednego znaczka i w konsekwencji zmiana tekstu). Dalsza część polega na (13. - 21.) utworzeniu szyfrogramu poprzez (16.) wyliczenie, który znak z klucza pobrać.
Do szyfrowania danych program korzysta dodatkowo z funkcji naCyfry(), która dla podanego znaku c zwraca jego wartość od 0 do 2 zgodnie ze strategią podaną wcześniej.
Funkcja rozszyfruj() przyjmuje dwa argumenty: data - tekst do rozszyfrowania oraz code - kod szyfrujący dane. Wynikiem działania funkcji jest szyfrogram.
(2. - 7.) Najpierw przekazany szyfrogram należy rozszyfrować zamieniając znaki na pary znaków czyli do postaci kodu Morse'a. Następnie odszyfrowany tekst Morse'a (8. - 20.) należy rozkodować i (21.) zwróć wynik.
Do szyfrowania danych program korzysta dodatkowo z funkcji naZnaki(), która dla podanej wartości c zwraca znak jej odpowiadający.
W celu przetestowania kodu można skorzystać z poniższego fragmentu, który wczyta od użytkownika tekst do zaszyfrowania oraz klucz szyfrujący: