Szyfr Karolinka opiera się na utworzeniu tabeli 10x10, która posłuży nam do szyfrowania danych. Na początek rysujemy tabelkę 10x10. Pierwsze pole na pozycji 1x1 zostawimy puste. W pierwszym wierszu kolejne pola uzupełniamy kolejnymi cyframi począwszy od 1 skończywszy na 9. Podobnie robimy dla pierwszej kolumny, gdzie kolejne pola uzupełniamy kolejnym cyframi począwszy od 1. W drugiej kolumnie do każdego kolejnego wiersza, począwszy od drugiego, wpisujemy kolejne litery wyrazu KAROLINKA. Następnie w każdym wierszu uzupełniamy wolne pola. Litera w danym polu musi być następna po literze w tym samym wierszu i kolumnie wcześniej zgodnie z alfabetem łacińskim. Zakładamy, że po literze Z mamy A. Innymi słowy jeśli wiersz zaczyna się od K to uzupełniamy go kolejno: L, M, N, O, P, Q, R, S. W ten sposób dla wyrazu KAROLINKA powstaje taka tabelka:
x | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
1 | K | L | M | N | O | P | Q | R | S |
2 | A | B | C | D | E | F | G | H | I |
3 | R | S | T | U | V | W | X | Y | Z |
4 | O | P | Q | R | S | T | U | V | W |
5 | L | M | N | O | P | Q | R | S | T |
6 | I | J | K | L | M | N | O | P | Q |
7 | N | O | P | Q | R | S | T | U | V |
8 | K | L | M | N | O | P | Q | R | S |
9 | A | B | C | D | E | F | G | H | I |
Jeśli chcemy zaszyfrować literę to szukamy jej wystąpienia w tabelce. Następnie patrzymy na numer kolumny, potem wiersza i zapisujemy je koło siebie (bez przerwy i w ustalonej kolejności). W ten sposób otrzymujemy liczbę, która jest naszym zaszyfrowanym znakiem. Warto zauważyć, że dana literę możemy szyfrować na kilka sposobów. Przykładowo literę A zaszyfrujemy jako 12 lub 19. Z drugiej strony literę Z zapiszemy tylko na jeden sposób: 93, a literę O na sześć różnych sposobów!
Zaszyfrowane znaki zapisujemy koło siebie i zostawiamy między nimi odstęp, ale jest to niekonieczne, ponieważ każdemu znakowi odpowiadają dokładnie dwie cyfry. W celu zoszyfrowania danych należy wybrać kolejne dwie cyfry, który będą współrzędnymi xy tabeli. Przykładowo 89 to 8 kolumna i 9 wiersz czyli litera H.
Nie, ale wyraz musi spełniać kilka warunków:
Napisz program, który na wejściu otrzyma tekst złożony z dużych liter alafabetu łacińskiego i zaszyfruje go przy pomocy szyfru KAROLINKA. Zaszyfrowany tekst powinien zostać wypisany na ekran.
Przykładowo dla wyrazu INFORMACJA otrzymamy:
Szyfrowanie można by przeprowadzić tak:
Jednak to podejście nie jest najlepsze: zużywamy dużo pamięci. Do tego rozwiązania nie podaje kodu - zostawiam jako dobre ćwiczenie do zapoznania się z tabelami 2D w C++.
Każda litera to specjalnie interpretowana liczba, dlatego możemy od siebie odejmować litery. Skorzystamy z tego w rozwiązaniu. Załóżmy, że nasze szyfrowanie będzie szukać pierwszego wystąpienia litery (nie będziemy korzystać z wielu wariantów zaszyfrowania jednego znaku). Podczas zapisywania szyfrogramu będziemy zostawiać przerwy między liczbami.
(1.) Przyjmujemy dwa argumenty: code - jest to nasze słowo klucz w szczególności KAROLINKA, a drugi to dowolne słowo. (2.) Ustalamy długość tekstu wynikowego: 2 miejsca na liczbę i jedno przerwy. (3.) Alokujemy pamięć pod wynik.
(4.) Dla każdego znaku do zaszyfrowania: (5.) ustalamy początkowy indeks kolumny na 0. Wiemy, że znak jeśli jest w wierszu j + 1 to musi być w zakresie [litera, litera + 8][litera, litera + 8]. Dzięki temu wiemy, że (6.) musimy zwiększać j, aż litera do zaszyfrowania będzie w podanym przedziale. Po znalezieniu wystarczy wyliczyć pozycje: (7.) (8.). Dodajemy do każdej pozycji jeden, ponieważ zaczynamy numerować wiersze i kolumny od 1. (9.) Dopisujemy znak przerwy.
(11.) Dopisujemy znak końca danych \0 i (12.) zwracamy szyfrogram.
Warto zauważyć, że funkcja korzysta z tu poprawności danych wejściowych, ponieważ inaczej kod w linijce (6.) zwróci błąd. Drugą kwestią jest możliwość wprowadzenia dowolnego klucza tworzącego tabelkę.
Deszyfrowanie jest prostsze w zapisie:
(1.) Wyliczamy długość tekstu wynikowego. (2.) Alokujemy pamięć pod tekst rozszyfrowany. (3.) Dla każdego zaszyfrowanego znaku: (4.) pobieramy dwie kolejne cyfry i korzystając z cipher odczytujemy zaszyfrowaną literę. Korzystamy tu z tego, ze pierwsza cyfra wskazuje kolumnę czyli y-1 znak cipher, a druga o ile powinniśmy ją przesunąć. (5.) Dopisujemy znak \0 i (6.) kończymy program.
Tym razem zmodyfikujemy kod, aby program uwzględniał różne warianty zaszyfrowania tego samego znaku:
Modyfikujemy dotychczasową funkcje cipher(), aby losowała numer wiersza z którego miałaby pobrać pozycję znaku. (5.) Dodajemy losowanie wiersza od którego zaczynamy poszukiwania znaku. Kod, aby zadziałać potrzebuje jeszcze zmiany w linijce (6.), aby nie wyjść poza zakres cipher.
Dane zaszyfrowane w ten sposób deszyfrujemy tą samą funkcję. W celu implementacji losowania należy dołączyć odpowiednie biblioteki:
oraz zainicjować losowanie w funkcji main():
Zmodyfikuj kod, aby:
Przykładowo dla danych: