Szyfr Vigenère jest szyfrem przestawieniowym polialfabetycznym, którego tekst jawny jest szyfrowany na podstawie klucza oraz tabelki. Tabelka jest stała i reprezentuje ją 26 alfabetów (w przypadku alfabetu łacińskiego).
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 | 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 |
B | 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 |
C | 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 |
D | 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 | C |
E | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D |
F | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E |
G | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F |
H | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G |
I | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H |
J | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I |
K | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J |
L | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K |
M | M | 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 |
N | 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 |
O | 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 | N |
P | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
Q | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P |
R | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q |
S | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R |
T | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S |
U | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T |
V | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U |
W | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V |
X | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W |
Y | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X |
Z | Z | 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 |
Tabelka jest bardzo duża, ale bardzo łatwo ją zapamiętać, ponieważ alfabet znajdujący się w i-tym wierszu jest alfabetem przesuniętym w lewo o i - 1 pozycji. Bardzo łatwo jest tutaj odnaleźć powiązanie z szyfrem Cezara.
Szyfrowanie tekstu polega na ustaleniu klucza. Klucz musi składać się z liter alfabetu użytego do zapisu tekstu jawnego. Jeśli ustalony klucz jest krótszy od szyfrowanego tekstu to wystarczy dopisywać do klucza jego oryginalną wartość, aby uzyskać klucz tej samej lub dłuższej długości niż tekst jawny. W celu zaszyfrowania i-tej litery należy znaleźć kolumnę o nagłówku równej jej wielkości, a następnie odczytać literę z wiersza, którego nagłówek jest i-tą literę klucza.
Podczas deszyfrowania i-tej należy znaleźć kolumnę o nagłówku równym i-tej wartości klucza (lub odpowiednika). W danej kolumnie następnie należy odnaleźć i-tą literę z szyfrogramu. Nagłówek wiersza w której znajduje się dana litera odpowiada rozszyfrowanej wartości podanej litery.
Szyfrując wyraz INFORMACJA kluczem HASLO należy kolejno: dla litery I odczytać wartość z kolumny I i wiersza H. W tym przypadku jest to litera P. Dla kolejnej litery będzie to kolumna N i wiersz A. W przypadku litery A żadna litera nie zostaje zaszyfrowana, ponieważ alfabet dla litery A klucza alfabet ma przesunięcie 0. Ostatecznie zaszyfrowany tekst to: PNXZFTAUUO.
Podczas deszyfrowania szyfrogramu PNXZFTAUUO przy pomocy klucza HASLO należy pamiętać, że: pierwsza litera szyfrogramu to P. W kolumnie H należy znaleźć wartość P i odczytać nagłówek wiersza. P zostaje rozszyfrowane jako I. Kontynuując w ten sposób uzyska się tekst jawny INFORMACJA.
Zaimplementowany kod będzie prawidłowo szyfrował tekst jawny przy pomocy klucza jeśli obie wartości są zapisane tylko przy pomocy małych liter alfabetu łacińskiego. Użycie liter spoza alfabetu spowoduje, że wartości będą wyświetlały się niepoprawnie. Nie istnieje potrzeba przechowywania całej tabelki w celu szyfrowania / deszyfrowania. Wszelkie wartości można odczytać na bieżąco przy pomocy dodawania u funkcji modulo.
(1.) Funkcja szyfrująca przyjmuje dwa argumenty: txt - tekst do zaszyfrowania oraz key - klucz według którego tekst będzie szyfrowany. (2., 3.) Alokacja pamięci pod tekst wynikowy i zapisanie znaku końca danych. (4.) Dla każdej litery tekstu txt: (5.) znajdź jego odpowiednik w tabelce i dopisz do wynik. Po zakończeniu pętli (6.) zwróć wynik.
Podobnie jak w szyfrowaniu. Różnica jest w (5.) gdzie wartość tekstu pobiera się na innych zasadach.
Funkcję szyfrującą i deszyfrującą można przetestować przy pomocy poniższej funkcji main(). Po uruchomieniu program zapyta się o podanie tekstu jawnego oraz klucza, a następnie wypisze tekst zaszyfrowany i deszyfrowany.
Według pierwszych zapisków szyfru Vigenère podczas szyfrowania należy ustalić tylko pierwszą literę klucza, a i-ta klucza odpowiada i - 1-szej literze tekstu jawnego.
Napisz program, który będzie szyfrował zgodnie z autokluczem według powyższego opisu. Możesz założyć, że klucz będzie podawany jako jedna litera. Tekst będzie złożony jedynie z małych liter alfabetu łacińskiego.
Przykładowo dla danych:
prawidłowy wynik to: