Szyfr Portax to szyfr, który powstał na bazie szyfru Porta. Zabezpieczanie danych odbywa się poprzez szyfrowanie kolejnych par znaków tekstu jawnego. Do szyfrowania tekstu jawnego służy tabelka, która składa się z dwóch alfabetów:
A1/1 | A | B | C | D | E | F | G | H | I | J | K | L | M |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
A1/2 | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
A2 | A | C | E | G | I | K | M | O | Q | S | U | W | Y |
B | D | F | H | J | L | N | P | R | T | V | X | Z |
Jak można zauważyć wiersz A1/1 jest utworzony z liter od A - M. Bardzo ważne, aby pamiętać, że jest to wiersz, który należy odpowiednio przesunąć dla aktualnego znaku z klucza. Litera "A" z A1/1 musi być ustawiona w kolumnie w której znak klucza znajduje się w alfabecie A2. Drugi wiersz i zarazem druga część pierwszego alfabetu A1/2 to pozostałe litery N - Z. Alfabet drugi w pierwszym wierszu zawiera litery o pozycjach nieparzystych, a w drugim te o indeksach parzystych.
Do szyfrowania potrzebny jest jeszcze klucz. Kluczem może być dowolne słowo, ale najlepiej jeśli nie jest zbyt długie, a litery się nie powtarzają. Długość klucza ma znaczenie na grupowanie znaków. Podczas szyfrowania należy zapisać kolejne znaki w tabeli o tylu kolumnach jakiej długości jest klucz. Następnie grupując wiersze po dwa należy szyfrować kolejne pary w każdej kolumnie. Tekst wynikowy powstaje poprzez zastąpienie znaków tekstów jawnego zaszyfrowanym i odczytanie go wierszami. Jeśli tekst jest długości nieparzystej to ostatni znak przepisuje się bez zmiany, albo dopisuje się jakiś losowy znak do tekstu jawnego.
Szyfrowanie pary polega na znalezieniu pierwszego znaku w pierwszym alfabecie (wiersz 1, 2), a drugiego znaku w drugim alfabecie (wiersz 3, 4). Jeśli wyszukiwane znaki znajdują się w tej samej kolumnie to każdy znak przechodzi na znak w tej samej kolumnie, ale z drugiego wiersza w obrębie tego samego alfabetu. W przypadku, gdy wyszukiwane znaki nie są w tej samej kolumnie to traktujemy je tak, że wyznaczają dwa rogi prostokąta. Szukamy pozostałych dwóch wierzchołków i pod nimi kryją się zaszyfrowane litery. Przepisujemy najpierw znak z alfabetu A1, a potem A2.
Proces deszyfrowania danych polega na ponownym zaszyfrowaniu danych przy pomocy tego samego klucza.
Weźmy przykładowo klucz "HASLO" i tekst "NIEZWYKLETAJNAINFORMACJA". Pierwszy etap polega na zbudowaniu tabeli do szyfrowania. Nad tabelką został zapisany klucz, aby było wiadomo, którą parę jakim znakiem klucza szyfrujemy:
H | A | S | L | O |
---|---|---|---|---|
N | I | E | Z | W |
Y | K | L | E | T |
A | J | N | A | I |
N | F | O | R | M |
A | C | |||
J | A |
Podczas tworzenia takiej tabeli należy pamiętać, że dążymy do utworzenia jak największej ilości par. Spróbujmy teraz zaszyfrować parę znaków NY. W tym celu należy rozpisać tabelkę szyfrującą dla znaku szyfrującego 'H', a następnie znaleźć znaki 'N' i 'Y' odpowiednio w A1 i A2.
A1/1 | J | K | L | A | B | C | D | E | F | G | H | I | J |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
A1/2 | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
A2 | A | C | E | G | I | K | M | O | Q | S | U | W | Y |
B | D | F | H | J | L | N | P | R | T | V | X | Z |
Znaki nie są w tym samym wierszu, więc szukamy prostokąta. Na czerwono znaleziono znaki N i Y. Z kolei na zielona znaleziono parę szyfrującą NY - jest to para ZA.
Spróbujmy teraz zaszyfrować parę IK. Wymaga to zmiany tabelki szyfrującej, ponieważ teraz nie szyfrujemy literą 'H' tylko 'A'. Szukamy znaków:
A1/1 | A | B | C | D | E | F | G | H | I | J | K | L | M |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
A1/2 | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
A2 | A | C | E | G | I | K | M | O | Q | S | U | W | Y |
B | D | F | H | J | L | N | P | R | T | V | X | Z |
Znaleziona para szyfrująca IK to FQ. Rozpatrzmy jeszcze parę WT szyfrowaną znakiem 'O'.
A1/1 | G | H | I | J | K | L | M | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
A1/2 | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
A2 | A | C | E | G | I | K | M | O | Q | S | U | W | Y |
B | D | F | H | J | L | N | P | R | T | V | X | Z |
Znalezione znaki są z tej samej kolumny, więc szyfrowanie polega na zamienie numera wiersza w obrębie tego samego alfabetu. W tym przypadku WT przechodzi na CS. Ostateczna tabelka, która pokazuje kolejno zaszyfrowane znaki przedstawia się następująco:
Klucz | H | A | S | L | O | H | A | S | L | O | H | A |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Znak1 | N | I | E | Z | W | A | J | N | A | I | A | C |
Znak2 | Y | K | L | E | T | N | F | O | R | M | J | A |
Szyfrogram | ZA | FQ | JB | PY | CS | DH | CT | UA | DL | ME | BH | AE |
Ostateczny szyfrogram to: ZFJPCAQBYSDCUDMHTALEBAHE. W celu odszyfrowania danych należy ponownie zaszyfrować szyfrogram przy pomocy tego samego klucza.
Poniższa implementacja zmienia dane zgodnie z szyfrem Portax. Zakłada ona poprawność wprowadzonych danych. Tekst jawny jak i hasło powinny być zapisane wielkimi litera i nie powinno być innych znaków.
W celu uproszczenia kodu zostały zdefiniowane dwa typy danych: pozycja do przechowywania pozycji znaku oraz para do przekazywania par znaków.
W programie nie jest przechowywana tabelka, ponieważ jest ona dynamiczna, a poza tym każdy z wierszy bardzo łatwo opisać przy pomocy jednolinikowej funkcji. Funkcja podajPozycje() dla określonego alfabetu tablica, znaku szyfrowanego znak szyfrowanego znakiem znak_klucza zwraca pozycję znaku w alfabecie. Pierwszy pozycja to numer wiersza w tabeli (indeksowanie od 1), a drugi to indeks kolumny (indeksowanie od 0).
Funkcja znakPozycja() pozwala skonwertować punkt na konkretny znak. W tym celu wystarczy podać konkretną pozycję (numer wiersza w tabeli oraz indeks kolumny) punkt oraz znak szyfrujący znak_klucz. Funkcja zwraca znak znajdujący się w tabeli na danej pozycji.
Do zaszyfrowanie pary służy funkcja szyfrujPare(), która przyjmuje dwa argumenty: znaki - para znaków do zaszyfrowania oraz znak_klucz - znak szyfrujący daną parę.
(2. - 3.) Określ pozycję znaków. (5.) Jeśli są w tej samej kolumnie to: (6. - 7.) zamień indeksy wierszy, w przeciwnym razie (9. - 10.) zamień jedynie indeksy kolumn (najprostszy sposób znajdowania pozostałych dwóch wierzchołków prostokąta). Na koniec (12.) zwróć parę znaków na pozycjach kolejna a i b.
Do szyfrowania podanego tekstu tekst przy poomcy klucza klucz służy funkcja szyfruj().
Oblicz (2.) długość klucza i (3.) tekstu jawnego. (4.) Utwórz nową tablice pod wynik i zadeklaruj (5.) indeks przesuwania oraz jaką długość ma grupa. (6.) W pętli (7.) wylicz ile znaków zostało do końca i na tej podstawie (8.) określ ile par znajduje się w kolejnych dwóch wierszach. (9. - 14.) dla każdej pary znajdź ich zaszyfrowane postacie. Potem (16.) przesuń aktualny indeks o podwójną długość grupy. (17.) Warunkiem wykonywania pętli jest istnienie chociaż jednej pary w tekście. (18. - 19.) Jeśli liczba znaków jest nieparzyste to przepisz ostatni znak bez zmian. Na koniec (20.) zwróć wskaźnik na tablicę wynik.
W celu przetestowania programu można skorzystać z poniższego kodu:
Napisz wersję program Portax, który będzie mógł przyjmować dowolny tekst, a szyfrowane będą jedynie znaki alfabetu łacińskiego. Dodatkowo po zakończeniu szyfrowani i-ty znak tekstu jawnego powinien mieć tą samą wielkość co przed szyfrowanie. Przykładowo tekst "Poufne dane zaszyfrowane szyfrem Portax." szyfrowany kluczem "HASLO" powinien dać w wyniku: