Implementacja algorytmu w języku C++

Napiszemy program, który po podaniu tekstu jawnego i rozmiaru klucza zwróci wiadomość zaszyfrowaną z wykorzystaniem algorytmu szyfrowania płotkowego.

Krok 1 – zdefiniowanie funkcji szyfrPlotkowy()

Funkcja będzie zwracać zaszyfrowany ciąg znaków. Zadeklarujemy ją, używając następujących parametrów:

  • jawny – tekst jawny wiadomości (wiadomość przeznaczona do zaszyfrowania),

  • klucz – wartość klucza, za pomocą którego tekst jawny zostanie zaszyfrowany.

Ponieważ chcemy zaszyfrować tekst, funkcja będzie przetwarzać oraz zwracać obiekty typu stringstringstring. Oto deklaracja tej funkcji (zmienna szyfrogram przechowuje zaszyfrowaną wiadomość):

Linia 1. string szyfrPlotkowy otwórz nawias okrągły string jawny przecinek int klucz zamknij nawias okrągły. Linia 2. otwórz nawias klamrowy. Linia 3. string szyfrogram znak równości cudzysłów cudzysłów średnik. Linia 5. return szyfrogram średnik. Linia 6. zamknij nawias klamrowy.

Krok 2 – tworzenie płotka

Płotkiem będzie dwuwymiarowa tablica znaków (elementów typu char), nosząca nazwę plotek. Liczba wierszy tablicy będzie równa wartości klucza, a liczba kolumn będzie taka sama, jak liczba liter w tekście jawnym. Długość tekstu sprawdzimy za pomocą funkcji size().

Początkowo tablica nie powinna zawierać tekstu. Wypełnimy ją znakami spacji. Użyjemy w tym celu zagnieżdżonych pętli for:

Linia 1. string szyfrPlotkowy otwórz nawias okrągły string jawny przecinek int klucz zamknij nawias okrągły. Linia 2. otwórz nawias klamrowy. Linia 3. string szyfrogram znak równości cudzysłów cudzysłów średnik. Linia 4. char plotek otwórz nawias kwadratowy klucz zamknij nawias kwadratowy otwórz nawias kwadratowy jawny kropka size otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik. Linia 6. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny klucz średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny jawny kropka size otwórz nawias okrągły zamknij nawias okrągły średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. plotek otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości apostrof apostrof średnik. Linia 9. zamknij nawias klamrowy. Linia 10. zamknij nawias klamrowy. Linia 12. return szyfrogram średnik. Linia 13. zamknij nawias klamrowy.

Krok 3 – wypełnienie płotka

Tablicę plotek[][] uzupełniamy kolejnymi znakami tekstu jawnego. W tym celu tworzymy dwie zmienne:

  • wiersz – służącą do przechowywania numeru wiersza tablicy, do którego będą wprowadzane znaki,

  • czyDol – informującą, „w którą stronę” wpisujemy elementy do tablicy. Jeżeli zmienna ta jest równa 1, numer wiersza zwiększa się do momentu, w którym stanie się on równy wartości klucza pomniejszonej o 1. Jeżeli zmienna czyDol będzie równa 0, numer wiersza będzie malał do momentu, w którym osiągnie on wartość 0.

Numer kolumny będzie równy numerowi indeksu tablicy jawny[]. Przechowywane w niej znaki zostaną kolejno zapisane we właściwych komórkach tablicy plotek[][].

Linia 1. string szyfrPlotkowy otwórz nawias okrągły string jawny przecinek int klucz zamknij nawias okrągły. Linia 2. otwórz nawias klamrowy. Linia 3. string szyfrogram znak równości cudzysłów cudzysłów średnik. Linia 4. char plotek otwórz nawias kwadratowy klucz zamknij nawias kwadratowy otwórz nawias kwadratowy jawny kropka size otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik. Linia 6. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny klucz średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny jawny kropka size otwórz nawias okrągły zamknij nawias okrągły średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. plotek otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości apostrof apostrof średnik. Linia 9. zamknij nawias klamrowy. Linia 10. zamknij nawias klamrowy. Linia 12. int wiersz znak równości 0 przecinek czyDol znak równości 1 średnik. Linia 14. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny jawny kropka size otwórz nawias okrągły zamknij nawias okrągły średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 15. plotek otwórz nawias kwadratowy wiersz zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości jawny otwórz nawias kwadratowy i zamknij nawias kwadratowy średnik. Linia 17. if otwórz nawias okrągły wiersz znak równości znak równości klucz minus 1 zamknij nawias okrągły. Linia 18. czyDol znak równości 0 średnik. Linia 19. else if otwórz nawias okrągły wiersz znak równości znak równości 0 zamknij nawias okrągły. Linia 20. czyDol znak równości 1 średnik. Linia 22. if otwórz nawias okrągły czyDol znak równości znak równości 1 zamknij nawias okrągły. Linia 23. wiersz znak równości wiersz plus 1 średnik. Linia 24. else. Linia 25. wiersz znak równości wiersz minus 1 średnik. Linia 26. zamknij nawias klamrowy. Linia 28. return szyfrogram średnik. Linia 29. zamknij nawias klamrowy.

Krok 4 – odczytanie szyfrogramu

Ponownie posłużymy się zagnieżdżonymi pętlami for, dzięki którym będziemy umieszczać w zmiennej szyfrogram kolejne znaki przechowywane w tablicy plotek[][] (z pominięciem spacji):

Linia 1. string szyfrPlotkowy otwórz nawias okrągły string jawny przecinek int klucz zamknij nawias okrągły. Linia 2. otwórz nawias klamrowy. Linia 3. string szyfrogram znak równości cudzysłów cudzysłów średnik. Linia 4. char plotek otwórz nawias kwadratowy klucz zamknij nawias kwadratowy otwórz nawias kwadratowy jawny kropka size otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik. Linia 6. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny klucz średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny jawny kropka size otwórz nawias okrągły zamknij nawias okrągły średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. plotek otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości apostrof apostrof średnik. Linia 9. zamknij nawias klamrowy. Linia 10. zamknij nawias klamrowy. Linia 12. int wiersz znak równości 0 przecinek czyDol znak równości 1 średnik. Linia 14. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny jawny kropka size otwórz nawias okrągły zamknij nawias okrągły średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 15. plotek otwórz nawias kwadratowy wiersz zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości jawny otwórz nawias kwadratowy i zamknij nawias kwadratowy średnik. Linia 17. if otwórz nawias okrągły wiersz znak równości znak równości klucz minus 1 zamknij nawias okrągły. Linia 18. czyDol znak równości 0 średnik. Linia 19. else if otwórz nawias okrągły wiersz znak równości znak równości 0 zamknij nawias okrągły. Linia 20. czyDol znak równości 1 średnik. Linia 22. if otwórz nawias okrągły czyDol znak równości znak równości 1 zamknij nawias okrągły. Linia 23. wiersz znak równości wiersz plus 1 średnik. Linia 24. else. Linia 25. wiersz znak równości wiersz minus 1 średnik. Linia 26. zamknij nawias klamrowy. Linia 28. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny klucz średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 29. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny jawny kropka size otwórz nawias okrągły zamknij nawias okrągły średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 30. if otwórz nawias okrągły plotek otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości apostrof apostrof zamknij nawias okrągły. Linia 31. szyfrogram znak równości szyfrogram plus plotek otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy średnik. Linia 32. zamknij nawias klamrowy. Linia 33. zamknij nawias klamrowy. Linia 35. return szyfrogram średnik. Linia 36. zamknij nawias klamrowy.

Niżej pokazujemy pełny kod programu. Musi się w nim znaleźć instrukcja, dzięki której dołączona zostanie biblioteka <string>. W funkcji main() należy podać tekst do zaszyfrowania oraz klucz:

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 2. kratka include otwórz nawias ostrokątny string zamknij nawias ostrokątny. Linia 3. using namespace std średnik. Linia 4. string szyfrPlotkowy otwórz nawias okrągły string jawny przecinek int klucz zamknij nawias okrągły. Linia 5. otwórz nawias klamrowy. Linia 6. string szyfrogram znak równości cudzysłów cudzysłów średnik. Linia 7. char plotek otwórz nawias kwadratowy klucz zamknij nawias kwadratowy otwórz nawias kwadratowy jawny kropka size otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik. Linia 9. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny klucz średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 10. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny jawny kropka size otwórz nawias okrągły zamknij nawias okrągły średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 11. plotek otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości apostrof apostrof średnik. Linia 12. zamknij nawias klamrowy. Linia 13. zamknij nawias klamrowy. Linia 15. int wiersz znak równości 0 przecinek czyDol znak równości 1 średnik. Linia 17. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny jawny kropka size otwórz nawias okrągły zamknij nawias okrągły średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 18. plotek otwórz nawias kwadratowy wiersz zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości jawny otwórz nawias kwadratowy i zamknij nawias kwadratowy średnik. Linia 20. if otwórz nawias okrągły wiersz znak równości znak równości klucz minus 1 zamknij nawias okrągły. Linia 21. czyDol znak równości 0 średnik. Linia 22. else if otwórz nawias okrągły wiersz znak równości znak równości 0 zamknij nawias okrągły. Linia 23. czyDol znak równości 1 średnik. Linia 25. if otwórz nawias okrągły czyDol znak równości znak równości 1 zamknij nawias okrągły. Linia 26. wiersz znak równości wiersz plus 1 średnik. Linia 27. else. Linia 28. wiersz znak równości wiersz minus 1 średnik. Linia 29. zamknij nawias klamrowy. Linia 30. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny klucz średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 31. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny jawny kropka size otwórz nawias okrągły zamknij nawias okrągły średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 32. if otwórz nawias okrągły plotek otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości apostrof apostrof zamknij nawias okrągły. Linia 33. szyfrogram znak równości szyfrogram plus plotek otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy średnik. Linia 34. zamknij nawias klamrowy. Linia 35. zamknij nawias klamrowy. Linia 36. return szyfrogram średnik. Linia 37. zamknij nawias klamrowy. Linia 39. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 40. string tekst znak równości cudzysłów MATURA cudzysłów średnik. Linia 41. int klucz znak równości 3 średnik. Linia 43. cout otwórz nawias ostrokątny otwórz nawias ostrokątny szyfrPlotkowy otwórz nawias okrągły tekst przecinek klucz zamknij nawias okrągły średnik. Linia 44. return 0 średnik. Linia 45. zamknij nawias klamrowy.

Słownik

tablica ASCII
tablica ASCII

spis kodów znaków wykorzystywany w komputerach

string
string

klasa języka C++, której obiekty służą do przechowywania ciągów znaków (takich jak całe zdania, np. „Ala ma kota”) albo pojedyncze wyrazy (np. „kot”)

szyfrogram
szyfrogram

zaszyfrowana wiadomość

iteracja
iteracja

technika programowania, która polega na powtarzaniu tej samej operacji określoną liczbę razy lub do momentu, w którym zadany warunek zostanie spełniony

zmienna logiczna
zmienna logiczna

zmienna, która przyjmuje wartości 1 (true – prawda) lub 0 (false – fałsz); najczęściej używana do sprawdzenia, czy dany warunek zachodzi

szyfrowanie
szyfrowanie

przekształcanie tekstu jawnego w szyfrogram

klucz
klucz

informacja, która jest wykorzystywana do szyfrowania  i/lub deszyfrowania wiadomości

klucz prywatny
klucz prywatny

tajny klucz wykorzystywany w procesie deszyfrowania w szyfrach asymetrycznych; powinien być znany jedynie adresatowi zaszyfrowanej wiadomości

klucz publiczny
klucz publiczny

udostępniony publicznie klucz wykorzystywany w procesie szyfrowania w szyfrach asymetrycznych

kryptografia
kryptografia

gałąź wiedzy o zapisywaniu informacji w sposób utrudniający, bądź całkowicie uniemożliwiający jej odczytanie