Szyfr Porta jest to szyfr wieloalfabetowy, który jest niemalże identyczny do szyfru Vigenère. Zasadniczą różnicą w obu szyfrach jest ilość alfabetów użytych do zabezpieczenia danych. W szyfrze Vigenère jest ich 26 (każda litera ma swój alfabet). Z kolei szyfr Porta ma ich tylko 13. Do szyfrowania danych używa się słowa klucza oraz niezależnej od szyfrowanego tekstu i klucza tabelki. W tabelce rozpisane zostały używane do szyfrowania alfabety dla każdej litery alfabetu tj.:
Klucz | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
A | B | n | o | p | q | r | s | t | u | v | w | x | y | z | a | b | c | d | e | f | g | h | i | j | k | l | m |
C | D | o | p | q | r | s | t | u | v | w | x | y | z | n | m | a | b | c | d | e | f | g | h | i | j | k | l |
E | F | p | q | r | s | t | u | v | w | x | y | z | n | o | l | m | a | b | c | d | e | f | g | h | i | j | k |
G | H | q | r | s | t | u | v | w | x | y | z | n | o | p | k | l | m | a | b | c | d | e | f | g | h | i | j |
I | J | r | s | t | u | v | w | x | y | z | n | o | p | q | j | k | l | m | a | b | c | d | e | f | g | h | i |
K | L | s | t | u | v | w | x | y | z | n | o | p | q | r | i | j | k | l | m | a | b | c | d | e | f | g | h |
M | N | t | u | v | w | x | y | z | n | o | p | q | r | s | h | i | j | k | l | m | a | b | c | d | e | f | g |
O | P | u | v | w | x | y | z | n | o | p | q | r | s | t | g | h | i | j | k | l | m | a | b | c | d | e | f |
Q | R | v | w | x | y | z | n | o | p | q | r | s | t | u | f | g | h | i | j | k | l | m | a | b | c | d | e |
S | T | w | x | y | z | n | o | p | q | r | s | t | u | v | e | f | g | h | i | j | k | l | m | a | b | c | d |
U | V | x | y | z | n | o | p | q | r | s | t | u | v | w | d | e | f | g | h | i | j | k | l | m | a | b | c |
W | X | y | z | n | o | p | q | r | s | t | u | v | w | x | c | d | e | f | g | h | i | j | k | l | m | a | b |
Y | Z | z | n | o | p | q | r | s | t | u | v | w | x | y | b | c | d | e | f | g | h | i | j | k | l | m | a |
W celu zaszyfrowania tekstu należy najpierw ustalić klucz. Klucz może być dowolnej długości i powinien składać się tylko z liter alfabetu, które zostały uwzględnione podczas tworzenia tabelki. Posiadając klucz i tekst można przejść do szyfrowania. Szyfrowanie polega na zamianie każdej litery w następujący sposób. Dla i-tej litery należy wziąć i-ty znak z klucza (jeśli klucz jest krótszy od tekstu to należy wziąć i mod długość klucza) i znaleźć w którym wierszu kolumny Klucz występuje litera. Kolejny krok polega na pobranie i-tej litery z tekstu. Należy ją zastąpić przez pole wskazane przez znaleziony wcześniej wiersz oraz kolumnę, która ma tą samą wartość co i-ta wartość tekstu. Deszyfrowanie polega na ponownym zaszyfrowaniu tekstu tym samym kluczem.
Przykładowo za klucz zostanie przyjęte słowo HASLO, a szyfrowany tekst to TAJNA INFORMACJA. Pierwszy krok polega na zaszyfrowaniu litery T. Z klucza pobierany jest odpowiedni znak. W tym przypadku jest to H i można go znaleźć w 4 wierszu tabelki. Natomiast pole w kolumnie T i wierszu 4 ma wartość D. Litera A jest szyfrowana przez literę A. W takim razie w szyfrogramie ma wartość N. Ostateczny zaszyfrowany tekst to DNSIU YAOJKPNYOU. W celu zwiększenia skuteczności szyfrowania z szyfrowanego tekstu można usunąć wszystkie znaki niebędące literami, albo cyframi.
Program będzie szyfrował tekst zapisany przy pomocy małych liter alfabetu łacińskiego. Należy zauważyć, że tabelka jest tak skonstruowana, że należy ją wczytać do programu. W tym przypadku nie wystarczy alfabet przesunąć o sumę miejsce litery n w alfabecie jak było w przypadku szyfru Vigenère. Numer wiersza też można wyliczyć na podstawie numeru litery w alfabecie. Wystarczy odjąć jeden, podzielić przez dwa, zaokrąglić wynik, a następnie dodać 1 (pierwszy i ostatni krok jest pomijany podczas pisania w C++, ponieważ pierwszy indeks to 0, a nie 1).
Wracają co problemu z kluczem strategia polega na zapisaniu wszystkich wierszy tabeli w postaci tekstu. Wszystkie dane nie będą rozdzielone, ani spacją, ani znakiem nowej linii - wszystkie dane mają tę samą długość i wiersze też, więc istnieje możliwość wyliczenia, który znak chcemy pobrać.
Funkcja change() będzie służyła do szyfrowania i deszyfrowania danych. Będzie przyjmować trzy argumenty: txt - tekst do zaszyfrowania, key - klucz użyty do szyfrowania danych oraz table - tablica znaków w tabelce. W tym przypadku jest założenie, że tabelka ma szerokość 26 znaków.
(2.) Zaalokowanie pamięci pod tekst wynikowy i (3.) zaznaczenie gdzie dane się kończą. (4.) Dla każdego znaku w tekście: (5.) sprawdzenie czy jest małą literą alfabetu łacińskiego. (6.) Jeśli jest to pobieramy odpowiedni znak z podane tabelki. (7.) Jednak jeśli jest to inny znak to (8.) przepisz znak. (9.) Na koniec zwróć szyfrogram.
Powyższą funkcję można przetestować przy pomocy poniższej funkcji main(). W celu zachowania czytelności kodu część wartości zmiennej table została zastąpiona trzykropkiem. Pełna wersja kodu jest dostępna do pobrania poniżej.
Napisz program, który:
Przykładowo dla danych klucza klucz oraz wiadomości To jest tajna INFORMACJA! poprawnym wynikiem będzie: