Projekt – określenie wymagań

Naszym zadaniem jest opracowanie projektuprojektprojektu. Określmy najpierw wymagania względem implementowanego programu.

Ogólny schemat działania

  • Program umożliwia szyfrowanie i deszyfrowanie zadanego ciągu znaków.

  • Użytkownik ma do wyboru więcej niż jeden algorytm szyfrowania/deszyfrowania.

  • Program wchodzi w interakcję z użytkownikiem.

Algorytmy szyfrowania/deszyfrowania

Przy szyfrowaniu bądź deszyfrowaniu wprowadzonego słowa, użytkownik będzie miał do wyboru dwa algorytmy:

  • szyfr Cezara,

  • szyfr płotkowy.

Menu i interfejs

  • Menu ma być zrealizowane w formie tekstowej.

  • Menu będzie zawierało trzy opcje do wyboru:

      1. szyfruj,

      1. deszyfruj,

      1. wyjdź z programu.

  • Po wyborze opcji 1. lub 2. użytkownik będzie musiał wybrać algorytm, za pomocą którego chce dokonać szyfrowania lub deszyfracji:

      1. szyfr Cezara,

      1. szyfr płotkowy.

Wykorzystywane algorytmy

Użytkownik będzie mógł zakodować lub odkodować dany ciąg znaków za pomocą jednego z dwóch algorytmów do wyboru. Zanim przystąpimy do ich implementacji, przypomnijmy krótko, na czym polega każda z tych metod.

Ważne!

Podczas implementacji projektu przyjmiemy założenie, że od użytkownika zawsze otrzymujemy ciąg znaków zapisany wielkimi literami.

Szyfr Cezara

Najważniejsze informacje dotyczące szyfrowania oraz deszyfrowania wiadomości za pomocą szyfru Cezara, a także jego implementacji w języku Java znajdziesz w następujących e‑materiałach:

Szyfr płotkowy

Najważniejsze informacje dotyczące szyfrowania oraz deszyfrowania wiadomości za pomocą szyfru płotkowego oraz jego implementacji w języku Java znajdziesz w następujących e‑materiałach:

Implementacja projektu

Algorytmy dokonujące szyfrowania i deszyfrowania zostaną zrealizowane w osobnych funkcjach.

Szyfrowanie (szyfr Cezara)

Funkcja realizująca szyfrowanie za pomocą algorytmu Cezara wygląda następująco:

Linia 1. static String szyfrujCezarem otwórz nawias okrągły String tekst przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. String wynik znak równości cudzysłów cudzysłów średnik. Linia 3. int ruch znak równości 0 średnik. Linia 5. if otwórz nawias okrągły klucz zamknij nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. if otwórz nawias okrągły klucz zamknij nawias ostrokątny 26 zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. klucz znak równości klucz procent 26 średnik. Linia 8. zamknij nawias klamrowy. Linia 9. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny tekst kropka length 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 10. ruch znak równości 0 średnik. Linia 11. if otwórz nawias okrągły tekst kropka charAt otwórz nawias okrągły i zamknij nawias okrągły plus klucz zamknij nawias ostrokątny 90 zamknij nawias okrągły otwórz nawias klamrowy. Linia 12. ruch znak równości otwórz nawias okrągły tekst kropka charAt otwórz nawias okrągły i zamknij nawias okrągły plus klucz zamknij nawias okrągły minus 26 średnik. Linia 13. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 14. ruch znak równości tekst kropka charAt otwórz nawias okrągły i zamknij nawias okrągły plus klucz średnik. Linia 15. zamknij nawias klamrowy. Linia 16. wynik plus znak równości otwórz nawias okrągły char zamknij nawias okrągły otwórz nawias okrągły ruch zamknij nawias okrągły średnik. Linia 17. zamknij nawias klamrowy. Linia 18. zamknij nawias klamrowy else if otwórz nawias okrągły klucz otwórz nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 19. if otwórz nawias okrągły klucz otwórz nawias ostrokątny minus 26 zamknij nawias okrągły otwórz nawias klamrowy. Linia 20. klucz znak równości klucz procent minus 26 średnik. Linia 21. zamknij nawias klamrowy. Linia 22. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny tekst kropka length 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 23. ruch znak równości 0 średnik. Linia 24. if otwórz nawias okrągły tekst kropka charAt otwórz nawias okrągły i zamknij nawias okrągły plus klucz otwórz nawias ostrokątny 65 zamknij nawias okrągły otwórz nawias klamrowy. Linia 25. ruch znak równości otwórz nawias okrągły tekst kropka charAt otwórz nawias okrągły i zamknij nawias okrągły plus klucz zamknij nawias okrągły plus 26 średnik. Linia 26. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 27. ruch znak równości tekst kropka charAt otwórz nawias okrągły i zamknij nawias okrągły plus klucz średnik. Linia 28. zamknij nawias klamrowy. Linia 29. wynik plus znak równości otwórz nawias okrągły char zamknij nawias okrągły otwórz nawias okrągły ruch zamknij nawias okrągły średnik. Linia 30. zamknij nawias klamrowy. Linia 31. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 32. wynik znak równości tekst średnik. Linia 33. zamknij nawias klamrowy. Linia 34. return wynik średnik. Linia 35. zamknij nawias klamrowy.

Szyfr Cezara jest przykładem szyfru podstawieniowegoszyfr podstawieniowyszyfru podstawieniowego.

Deszyfrowanie (szyfr Cezara)

Do deszyfrowania ciągu znaków zakodowanego za pomocą szyfru Cezara wykorzystamy tę samą funkcję, która służy do szyfrowania - szyfrujCezarem(). Przy deszyfrowaniu wartość klucza szyfrującego zostanie zamieniona na liczbę przeciwną. Warto jednak zgodnie z dobrymi praktykami programistycznymi, zaimplementować funkcję deszyfrujCezarem(), która wykorzysta funkcję szyfrujCezarem(), aby odszyfrować zadany tekst. Funkcja ta będzie również odpowiedzialna za zamianę klucza na liczbę przeciwną.

Linia 1. static String deszyfrujCezarem otwórz nawias okrągły String tekst przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. return szyfrujCezarem otwórz nawias okrągły tekst przecinek minus klucz zamknij nawias okrągły średnik. Linia 3. zamknij nawias klamrowy.

Szyfrowanie (szyfr płotkowy)

Szyfrowanie zadanego ciągu znaków zostało omówione w e‑materiale Wstęp do kryptografii w języku JavaPoHIqE6ZgWstęp do kryptografii w języku Java). Szyfr ten jest szyfrem przestawieniowymszyfr przestawieniowyszyfrem przestawieniowym. Algorytm opiera się na dwóch pętlach. W pierwszej przechodzimy „zygzakiem” po płotku, zapisując w polach kolejne znaki ciągu do zaszyfrowania. W drugiej pętli przechodzimy wiersz po wierszu i zapisujemy napotkane znaki do zmiennej wynik. Implementacja zakłada, że wysokość płotu (wartość parametru klucz) jest nie mniejsza od 2.

Oto kod całej funkcji wykonującej szyfrowanie metodą płotkową:

Linia 1. static String szyfrujMetodaPlotkowa otwórz nawias okrągły String tekst przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. String wynik znak równości cudzysłów cudzysłów średnik. Linia 3. boolean wDol znak równości true średnik. Linia 4. Character otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy plot znak równości new Character otwórz nawias kwadratowy tekst kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy otwórz nawias kwadratowy klucz zamknij nawias kwadratowy średnik. Linia 6. for otwórz nawias okrągły int i znak równości 0 przecinek j znak równości 0 średnik i otwórz nawias ostrokątny tekst kropka length 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 7. plot otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości tekst kropka charAt otwórz nawias okrągły i zamknij nawias okrągły średnik. Linia 8. if otwórz nawias okrągły j znak równości znak równości klucz minus 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 9. wDol znak równości false średnik. Linia 10. zamknij nawias klamrowy else if otwórz nawias okrągły j znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 11. wDol znak równości true średnik. Linia 12. zamknij nawias klamrowy. Linia 14. if otwórz nawias okrągły wDol zamknij nawias okrągły otwórz nawias klamrowy. Linia 15. j plus plus średnik. Linia 16. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 17. j minus minus średnik. Linia 18. zamknij nawias klamrowy. Linia 19. zamknij nawias klamrowy. Linia 20. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny klucz średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 21. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny plot kropka length średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 22. if otwórz nawias okrągły plot otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości null zamknij nawias okrągły otwórz nawias klamrowy. Linia 23. wynik plus znak równości plot otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy średnik. Linia 24. zamknij nawias klamrowy. Linia 25. zamknij nawias klamrowy. Linia 26. zamknij nawias klamrowy. Linia 27. return wynik średnik. Linia 28. zamknij nawias klamrowy.

Deszyfrowanie (szyfr płotkowy)

Cała funkcja deszyfrowania wygląda tak:

Linia 1. static String deszyfrujMetodaPlotkowa otwórz nawias okrągły String tekst przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. String wynik znak równości cudzysłów cudzysłów średnik. Linia 3. boolean wDol znak równości true średnik. Linia 4. Character otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy plot znak równości new Character otwórz nawias kwadratowy tekst kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy otwórz nawias kwadratowy klucz zamknij nawias kwadratowy średnik. Linia 5. for otwórz nawias okrągły int i znak równości 0 przecinek j znak równości 0 średnik i otwórz nawias ostrokątny tekst kropka length 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 6. plot otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości apostrof X apostrof średnik. Linia 7. if otwórz nawias okrągły j znak równości znak równości klucz minus 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. wDol znak równości false średnik. Linia 9. zamknij nawias klamrowy else if otwórz nawias okrągły j znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 10. wDol znak równości true średnik. Linia 11. zamknij nawias klamrowy. Linia 13. if otwórz nawias okrągły wDol zamknij nawias okrągły otwórz nawias klamrowy. Linia 14. j plus plus średnik. Linia 15. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 16. j minus minus średnik. Linia 17. zamknij nawias klamrowy. Linia 18. zamknij nawias klamrowy. Linia 19. for otwórz nawias okrągły int i znak równości 0 przecinek k 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 20. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny tekst kropka length 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 21. if otwórz nawias okrągły plot otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy wykrzyknik znak równości null zamknij nawias okrągły otwórz nawias klamrowy. Linia 22. plot otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości tekst kropka charAt otwórz nawias okrągły k zamknij nawias okrągły średnik. Linia 23. k plus plus średnik. Linia 24. zamknij nawias klamrowy. Linia 25. zamknij nawias klamrowy. Linia 26. zamknij nawias klamrowy. Linia 27. for otwórz nawias okrągły int i znak równości 0 przecinek j znak równości 0 średnik i otwórz nawias ostrokątny tekst kropka length 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 28. wynik plus znak równości plot otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy średnik. Linia 29. if otwórz nawias okrągły j znak równości znak równości klucz minus 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 30. wDol znak równości false średnik. Linia 31. zamknij nawias klamrowy else if otwórz nawias okrągły j znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 32. wDol znak równości true średnik. Linia 33. zamknij nawias klamrowy. Linia 34. if otwórz nawias okrągły wDol zamknij nawias okrągły otwórz nawias klamrowy. Linia 35. j plus plus średnik. Linia 36. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 37. j minus minus średnik. Linia 38. zamknij nawias klamrowy. Linia 39. zamknij nawias klamrowy. Linia 40. return wynik średnik. Linia 41. zamknij nawias klamrowy.

Oto opis wybranych fragmentów kodu algorytmu deszyfrującego:

  • linia 4. – zadeklarowanie dwuwymiarowej tablicy znaków, która będzie pełnić funkcję płotka,

  • linie 5.-18. – przejście „zygzakiem” po tablicy dwuwymiarowej i oznaczenie ścieżki znakami „X”,

  • linie 19.-26. – przejście tablicy wiersz po wierszu i wstawianie kolejnych znaków zaszyfrowanego ciągu w miejsca oznaczone wcześniej znakiem „X”,

  • linie 27.-39. – ponowne przejście „zygzakiem” po tablicy i zapisanie kolejnych wartości do zmiennej wynik,

  • linia 40. – zwrócenie zmiennej wynik, będącej odszyfrowanym ciągiem znaków.

Menu programu

Menu będzie oparte na wyświetlaniu użytkownikowi tekstowych komunikatów, informujących go o możliwych do podjęcia wyborach. Przejdź do kolejnej sekcji, w której dokończymy implementację programu, a także przeanalizujemy schemat jego działania.

Słownik

projekt
projekt

zbiór działań mający na celu stworzenie unikalnego produktu lub usługi w określonym czasie

szyfr podstawieniowy
szyfr podstawieniowy

szyfr, w którym znaki ciągu do zaszyfrowania są zastępowane innymi znakami (według określonej reguły)

szyfr przestawieniowy
szyfr przestawieniowy

szyfr, który polega na przestawieniu kolejności znaków w szyfrowanym ciągu znaków