Szyfr Grandpre to szyfr, który do szyfrowania wykorzystuje klucz, który jest tablicą 8×8. Klucz składa się z dziewięciu, ośmioliterowych wyrazów. Osiem z nich jest zapisanych wierszami jeden pod drugim. Dziewiąty wyraz musi powstać z liter czytanych od góry w pierwszej kolumnie. Znalezienie takiego klucza nie należy do najłatwiejszych zadań i warto do tego celu wykorzystać komputer.
Proces szyfrowania polega na zastępieniu każdej litery przy pomocy współrzędnych odczytanych na podstawie klucza. Warto zauważyć, że np. znaków w alfabecie łacińskim jest 26, a pól 64, więc na pewno istnieje znak, która można zaszyfrować na trzy różne sposoby! Zapisanie kolejnych par współrzędnych wiersz×kolumna jedna po drugiej utworzy szyfrogram.
Proces rozszyfrowywania jest bardzo prosty i polega na odczytaniu każdych kolejnych dwóch cyfr, a następnie znalezieniu litery w tabeli na podstawie odczytanej pary znaków. Odczytane wartości z tabeli utworzą tekst jawny.
Do zaszyfrowanie jest tekst "TAJNAINFORMACJA". Podczas szyfrowania zostanie użyty klucz rozpisany niżej. Jak można zauważyć 8 wyrazów jest wpisanych w kolejnych wierszach, a pierwsza kolumna również zawiera prawidłowy wyraz. Polskie znaki zostały specjalnie zastąpione ich łacińskimi odpowiednikami.
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
---|---|---|---|---|---|---|---|---|
1 | G | A | L | E | C | Z | K | A |
2 | A | B | E | C | A | D | L | O |
3 | R | A | C | H | O | W | A | C |
4 | N | A | K | L | E | J | K | A |
5 | I | M | P | A | K | T | O | R |
6 | T | A | K | S | O | W | K | A |
7 | U | M | Y | W | A | L | K | A |
8 | R | E | F | L | E | K | S | Y |
Pierwsza litera T znajduje się w piątym wierszu i szóstej kolumnie, więc odpowiada jej para cyfr 56. Jednak literę tę można też zaszyfrować jako 61. Kolejna litera to A. Ze względu na jej wysoką częstotliwość występowania w słowniku w tabelce można znaleźć, aż 13 razy. Innymi słowy literę A można zapisać jako jedną z następujących opcji: {12, 18, 21, 25, 32, 37, 42, 48, 54, 62, 68, 75, 78}.
Przykładowy ostateczny szyfrogram to: "563246417851418357817262384654".
Przedstawiony poniżej kod korzysta z pseudolosowości w celu wybrania jednej z wielu dostępnych opcji zaszyfrowania wybranego znaku. Szyfrowany tekst może zawierać tylko znaki umieszczone w kluczu. Ponadto program zakłada poprawność danych wejściowych. Klucz jest przechowywany jako 64 znakowy ciąg znaków. Dzięki temu kod się nieco upraszcza.
Do szyfrowania należy wywołać funkcję szyfruj() i podać dwa argumenty: tekst - tekst jawny do zaszyfrowania oraz klucz - tabelka w formie ciągu znaków. Funkcja zwróci wskaźnik na miejsce w pamięci gdzie znajdują się zaszyfrowane dane.
(2.) Pobierz długość tekstu i (3.) alokuj miejsce pod tablicę wynikową. (4.) Dla każdego znaku tekstu jawnego: (5.) znajdź pozycję znaku w kluczu, (6.) określ numer kolumny, a potem (7. - 8.) dopisz współrzędne do tablicy wyniku. Na koniec (10.) dopisz znak końca danych i (11.) zwróć wskaźnik.
W celu wylosowania pozycji znaku szyfrowanego funkcja szyfruj() korzysta z funkcji szukajLosowa(), która przyjmuje data - ciąg znaków klucza oraz c - znak do wyszukania.
Pierwszy etap polega na zliczeniu ile jest wystąpień danego znaku w kluczu. (2.) Inicjalizacja licznika, a następnie (3. - 7.) policzenie wystąpień. Jeśli (8.) zmienna ile wynosi 0 to szukany znak nie występuje w kluczu. W takim przypadku (9.) można zwrócić dowolną wartość.
Drugi etap polega na: (10.) wylosowaniu, która pozycja ma zostać pobrana danego znaku. Następnie (11. - 20.) wyszukiwanie jest takie samo jak w poprzednim przypadku z tą różnicą, że jeśli (14.) zostanie znaleziona wylosowana pozycja to (15.) należy zwrócić pozycję znaku w kluczu. (21.) Linijka ta jest co prawda zbędna, ale bez niej nie można skompilować programu, ponieważ kompilator nie widzi tego, że program zawsze zwróći wartość w linijce (15.).
Do rozszyfrowania danych służy funkcja rozszyfruj(), która pryjmuje dwa argumenty: tekst - szyfrogram do rozszyfrownia oraz klucz - klucz, który został użyty do zaszyfrowania danych.
(2.) Wylicz długość tekstu jawnego i (3.) alokuj pamięć. Następnie (4.) dla każdej pary cyfr: (5.) znajdź na podstawie współrzędnych zaszyfrowany znak. (6.) Dopisz znak końca danych i (7.) zwróć wynik.
Poniżej została przedstawiona przykładowa funkcja main(), która wczytuje od użytkownika klucz oraz tekst jawny, a następnie pokazuje szyfrogram oraz roszyfrowany szyfrogram:
W celu wczytania klucza została napisana dodatkowa funkcja kluczWczytaj(), która wczytuje od użytkownika 8 linijek tabeli po 8 znaków.