Szyfr Condi to szyfr, który wykorzystuje przesunięcia do szyfrowania kolejnych liter. W celu zaszyfrowania trzeba jedynie podać przesunięcie pierwszego znaku. Każdy następny znak jest szyfrowany na podstawie poprzedniego. W celu zwiększenia bezpieczeństwa danych wykorzystywane jest słowo klucz, które ustala alfabet na podstawie określa się litery po przesunięciu. Podczas szyfrowania zachowywane są wszystkie znaki interpunkcyjne.
Pierwszy etap szyfrowania rozpoczyna się od ustalenia słowa klucza. Przyjmijmy, że taki słowem będzie wyraz "KLUCZ". Należy z niego wybrać wszystkie unikalne pierwsze wystąpienia liter, a następnie dopisać wszystkie litery alfabetu w kolejności alfabetycznej, które nie wystąpiły w słowie klucz. Na koniec należy ponumerować kolejne litery. Wynik tego etap został przedstawiony w tabeli.
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
K | L | U | C | Z | A | B | D | E | F | G | H | I | J | M | N | O | P | Q | R | S | T | V | W | X | Y |
Najprotszym sprawdzeniem czy alfabet jest poprawny jest porównanie długości alfabetu powstałego z wybranym np. łacińskim oraz sprawdzenie czy żadna litera się nie powtarza.
Każda kolejna litera jest szyfrowana poprzez przesunięcie jej o tyle pozycji jaką pozycje ma poprzednia litera w szyfrowanym tekście. Jednak pierwsza litera nie ma nic przed sobą, więc potrzebne jest wstępne przesunięcie. Przyjmijmy, że początkowe przesunięcie ma wartość 7. Wtedy kolejne litery są szyfrowane następująco:
Przesunięcie | Litera | Pozycja | Nowa Litera |
---|---|---|---|
7 | T | 22 | U |
22 | A | 6 | L |
6 | J | 14 | R |
14 | N | 16 | C |
16 | A | 6 | T |
6 | - | - | - |
6 | I | 13 | Q |
13 | N | 16 | U |
16 | F | 10 | Y |
10 | O | 17 | K |
17 | R | 20 | G |
20 | M | 15 | E |
15 | A | 6 | S |
6 | C | 4 | F |
4 | J | 14 | P |
14 | A | 6 | R |
Ostatecznie szyfrogram to: "ULRCT QUYKGESFPR".
Rozszyfrowywanie danych należy tak jak szyfrowanie przeprowadzić od lewej do prawej. W celu rozszyfrowania pierwszej litery należy przesunąć ją o ustalone przesunięcie w lewo. Dopiero pozycja odszyfrowanej litery może posłużyć do odszyfrowania kolejnej litery.
Przedstawiona przykładowa implementacja pozwala na zaszyfrowanie jedynie wielkich liter. Wszystkie pozostałe znaki są traktowane jako interpunkcyjne i są przepisywane na tą samą pozycję w wyniku w której są zapisane w szyfrowanym tekście bez zmian. Program zakłada poprawność danych wejściowych.
Funkcja utworzAlfabet() przyjmuje tylko jeden argument: slowoKluczowe - jest to słowo kluczowe. Zwracanym wynikiem jest alfabet potrzebny do szyfrowania. Dokładane litery są tutaj pobierane z alfabetu łacińskiego.
Przedstawiona funkcja szyfrująca szyfruj() przyjmuje trzy argumenty: tekst - tekst do zaszyfrowania, klucz - słowo klucz na podstawie którego będzie ustalony alfabet oraz przes - liczba oznaczająca przesunięcie pierwszego znaku. Wynikiem działania funkcji jest szyfrogram.
Poniższa funkcja deszyfrująca rozszyfruj() przyjmuje trzy argumenty: tekst - szyfrogram do rozszyfrowania, klucz - słowo klucz na podstawie którego będzie ustalony alfabet oraz przes - liczba oznaczająca przesunięcie pierwszego znaku. Wynikiem działania funkcji jest szyfrogram.
Działanie funkcji można przetestować przy pomocy poniższego fragmentu kodu:
W przypadku szyfru Condi każdy następny znak jest szyfrowany na podstawie poprzedniego. Uogólnijmy to do przypadku szyfrowania, gdzie n-ty znak będzie szyfrowany na podstawie znaku na pozycji n - k. Pierwsze k znaków powinno zostać zaszyfrowane przez przesunięcie podane na początku. Napisz funkcje i sprawdź ich działanie.
Szyfrują wyrażenie "TAJNA INFORMACJA" przy pomocy słowa klucz "KLUCZ", przesunięcia 7 na podstawie wyrazu o k = 3 pozycji wcześniej otrzymamy szyfrogram: