Szyfr Sylabiki potrzebuje klucza do szyfrowania. Taki klucz dzieli się na sylaby, które z kolei tworzą pary liter, dlatego bardzo ważne jest, aby długość klucza była parzysta. Co więcej w kluczu każdy znak powinien wystąpić najwyżej raz. Podczas szyfrowania tekstu sprawdzamy czy sprawdzany znak tekstu jawnego występuje w którejś z par. Jeśli tak to daną literę zamieniamy na powiązaną z nią, a jeśli nie to przepisujemy literkę bez zmian.
Przykładowo weźmy najbardziej znany klucz: GADERYPOLUKI. W celu uproszczenia kodowania zapiszmy go dzieląc klucz na sylaby: GA-DE-RY-PO-LU-KI. Jednak taki sposób nie jest dla wszystkich przejrzysty, dlatego drugim polecanym sposobem jest zapisanie klucza w tabelce. Tabelkę tworzymy zapisując litery kolejnych sylab jedna pod drugą:
Z | G | D | R | P | L | K |
---|---|---|---|---|---|---|
na | A | E | Y | O | U | I |
Teraz chcąc zaszyfrować słowo DRUH szukamy kolejno w tabelce: D i zamieniamy na E, R zamieniamy na Y, U na L - warto zauważyć, że nieważne w którym wierszu zapisane jest litera, bo i tak zamieniamy na drugą literę z tej samej kolumny. Ostatnią literą do zaszyfrowania jest H, które nie występuje w kluczu, więc przepisujemy literę bez zmian. Zapisując kolejne litery koło siebie otrzymujemy tekst zaszyfrowany: EYLH.
W przypadku deszyfrowania wykonujemy dokładnie te same operacje co podczas szyfrowania. Czyli w celu rozszyfrowania powyższego przykładu wystarczyłoby zaszyfrować go z kluczem AGEDYROPULIK.
Napisz program, który na wejściu wczyta dwie linijki tekstu. Pierwsza będzie zawierała klucz, a druga tekst do zaszyfrowania. Na wyjście powinien zostać wypisany tekst zaszyfrowany zgodnie z szyfrem Literówka przy użyciu wczytanego klucza. Przed szyfrowaniem program musi sprawdzić czy długość klucza jest prawidłowa. Jeśli nie to powinien zwrócić sam znak końca linii. Przykładowo dla wejścia:
otrzymamy:
W wczytanym kodzie będziemy potrzebowali znaleźć konkretny znak, dlatego napiszemy funkcje findChar(), która przyjmie dwa argumenty tekst do przeszukania oraz znak do znalezienia. Funkcja jeśli znajdzie znak w tekście zwróci jego pozycję, a jeśli nie to wartość -1.
(2.) Dla każdego znaku w tekście (3.) funkcja sprawdza czy jest szukanym znakiem. Jeśli tak to (4.) zwracam na której leży pozycję. Jednak jeśli pętla (2.) się zakończy (natrafi na znak \0) to znaczy, że znak nie występuje w tekście czyli wtedy (5.) zwraca -1.
W opisie szyfru wspomniałem, że deszyfrowanie odbywa się poprzez ponowne szyfrowanie co można udowodnić faktem, że kolejne znaki zamieniamy w parach.
(2.) Ustalamy jakiej długości będzie tekst wynikowy. Tutaj też sprawdzamy czy kod potrzebny do szyfrowania jest prawidłowy, ponieważ sprawdzamy czy klucz jest parzystej długości. Jeśli jest to ustalamy długość tekstu wynikowego na długość tekstu jawnego (bądź zaszyfrowanego). Jeśli nie to długość będzie 0 czyli dopiszemy sam znak końca linii. (2.) Alokujemy pamięć pod tekst wynikowy. (4.) Dla każdego znaku w tekście (5.) szukamy jego pozycji i zapisujemy do tymczasowej zmiennej t. (6.) Szyfrowanie znaku odbywa się dwuetapowo: jeśli pozycja wynosi -1 to sytuacja jest prosta: przepisujemy i-ty znak z podanego tekstu. Jednak, gdy pozycja jest > -1 to sprawdzamy czy pozycja jest parzysta czy nieparzysta, ponieważ jeśli pozycja jest parzysta to litera powiązana w parze jest po prawej stronie. Dla znaków na pozycji nieparzystej sytuacja jest analogiczna. (8.) Na sam koniec dopisujemy znak końca linii i (9.) zwracamy wynik.
Poniższa funkcja main() pozwala przetestować napisany powyżej kod:
Zmodyfikuj funkcję, aby tekst był zaszyfrowany przy pomocy wprowadzonego klucza oraz klucza powstałego poprzez zamianę dużych liter w kluczu na małe oraz małych na duże. Spróbuj napisać kod, aby funkcję change() wywołać tylko raz z oryginalnym kluczem.
Przykładowo dla danych:
Linijki (4. - 6.) funkcji change() zapisz jako dwie linijki.