Napiszemy program, który odczyta podany przez użytkownika ciąg znaków, następnie zaszyfruje go za pomocą metody płotkowej i wypisze wynik szyfrowania na ekran konsoli. Algorytm deszyfrowania zostanie zrealizowany w osobnej funkcji, aby zwiększyć czytelność kodu.
Funkcja szyfrująca
Zaczynamy od napisania funkcji odpowiadającej za szyfrowanie. Nadajemy jej nazwę szyfrujPlotkowo() oraz określamy przyjmowane parametry.
Specyfikacja problemu:
Dane:
ciag – zadany przez użytkownika ciąg znaków do zaszyfrowania
klucz – kluczkluczklucz, czyli liczba całkowita dodatnia, określająca wysokość płotka
Wynik:
zaszyfrowane – zaszyfrowany ciąg znaków
Linia 1. static String szyfrujPlotkowo otwórz nawias okrągły String ciag przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 3. zamknij nawias klamrowy.
static String szyfrujPlotkowo(String ciag, int klucz) {
}
Manipulacja znakami w łańcuchu znaków jest utrudniona. Deklarujemy tablicę znaków char[] zaszyfrowane o długości równej długości szyfrowanego ciągu. Na jej podstawie utworzymy i zwrócimy napis przechowujący szyfrogramszyfrogramszyfrogram.
Linia 1. static String szyfrujPlotkowo otwórz nawias okrągły String ciag przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy zaszyfrowane znak równości new char otwórz nawias kwadratowy ciag kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 4. return new String otwórz nawias okrągły zaszyfrowane zamknij nawias okrągły średnik.
Linia 5. zamknij nawias klamrowy.
static String szyfrujPlotkowo(String ciag, int klucz) {
char[] zaszyfrowane = new char[ciag.length()];
return new String(zaszyfrowane);
}
Długość ciągu znaków uzyskujemy dzięki funkcji wbudowanej – length().
Dla zainteresowanych
Więcej o funkcji length() możesz przeczytać w dokumentacji języka Java.
Tworzymy nową zmienną n i ustawiamy jej wartość początkową 0. Jej zadaniem jest wskazanie indeksu w tablicy zaszyfrowane, pod którym zostanie zapisany przetwarzany znak tekstu jawnego.
Linia 1. static String szyfrujPlotkowo otwórz nawias okrągły String ciag przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy zaszyfrowane znak równości new char otwórz nawias kwadratowy ciag kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 3. int n znak równości 0 średnik.
Linia 5. return new String otwórz nawias okrągły zaszyfrowane zamknij nawias okrągły średnik.
Linia 6. zamknij nawias klamrowy.
static String szyfrujPlotkowo(String ciag, int klucz) {
char[] zaszyfrowane = new char[ciag.length()];
int n = 0;
return new String(zaszyfrowane);
}
Deklarujemy pętlę for. Jej iterator z będzie wskazywać poziom płotka, dla którego będziemy wyznaczać kolejne znaki szyfrogramu.
Linia 1. static String szyfrujPlotkowo otwórz nawias okrągły String ciag przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy zaszyfrowane znak równości new char otwórz nawias kwadratowy ciag kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 3. int n znak równości 0 średnik.
Linia 5. for otwórz nawias okrągły int z znak równości 0 średnik z otwórz nawias ostrokątny klucz średnik z plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 7. zamknij nawias klamrowy.
Linia 9. return new String otwórz nawias okrągły zaszyfrowane zamknij nawias okrągły średnik.
Linia 10. zamknij nawias klamrowy.
static String szyfrujPlotkowo(String ciag, int klucz) {
char[] zaszyfrowane = new char[ciag.length()];
int n = 0;
for(int z = 0; z < klucz; z++) {
}
return new String(zaszyfrowane);
}
Wewnątrz pętli for tworzymy dwie zmienne: indeks oraz wDol. Pierwsza posłuży do wskazania znaku tekstu jawnego, który zostanie zapisany w tablicy zaszyfrowane pod indeksem n. Druga – do wskazania kierunku (w górę/w dół) uzupełniania szczebli płotka.
Linia 1. static String szyfrujPlotkowo otwórz nawias okrągły String ciag przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy zaszyfrowane znak równości new char otwórz nawias kwadratowy ciag kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 3. int n znak równości 0 średnik.
Linia 5. for otwórz nawias okrągły int z znak równości 0 średnik z otwórz nawias ostrokątny klucz średnik z plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. int indeks znak równości z średnik.
Linia 7. boolean wDol znak równości true średnik.
Linia 8. zamknij nawias klamrowy.
Linia 10. return new String otwórz nawias okrągły zaszyfrowane zamknij nawias okrągły średnik.
Linia 11. zamknij nawias klamrowy.
static String szyfrujPlotkowo(String ciag, int klucz) {
char[] zaszyfrowane = new char[ciag.length()];
int n = 0;
for(int z = 0; z < klucz; z++) {
int indeks = z;
boolean wDol = true;
}
return new String(zaszyfrowane);
}
Dodajemy pętlę while. Będzie się ona wykonywać, dopóki wartość zmiennej indeks będzie mniejsza od długości ciągu. Innymi słowy – posłuży do wskazania, czy powinniśmy przejść do kolejnego poziomu płotka.
Linia 1. static String szyfrujPlotkowo otwórz nawias okrągły String ciag przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy zaszyfrowane znak równości new char otwórz nawias kwadratowy ciag kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 3. int n znak równości 0 średnik.
Linia 5. for otwórz nawias okrągły int z znak równości 0 średnik z otwórz nawias ostrokątny klucz średnik z plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. int indeks znak równości z średnik.
Linia 7. boolean wDol znak równości true średnik.
Linia 9. while otwórz nawias okrągły indeks otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 11. zamknij nawias klamrowy.
Linia 12. zamknij nawias klamrowy.
Linia 14. return new String otwórz nawias okrągły zaszyfrowane zamknij nawias okrągły średnik.
Linia 15. zamknij nawias klamrowy.
static String szyfrujPlotkowo(String ciag, int klucz) {
char[] zaszyfrowane = new char[ciag.length()];
int n = 0;
for(int z = 0; z < klucz; z++) {
int indeks = z;
boolean wDol = true;
while (indeks < ciag.length()) {
}
}
return new String(zaszyfrowane);
}
Zaprezentowany kod stanowi pełną implementację algorytmu szyfrowania metodą płotkową. Algorytm opiera się na trzech przypadkach:
Linia 1. static String szyfrujPlotkowo otwórz nawias okrągły String ciag przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy zaszyfrowane znak równości new char otwórz nawias kwadratowy ciag kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 3. int n znak równości 0 średnik.
Linia 5. for otwórz nawias okrągły int z znak równości 0 średnik z otwórz nawias ostrokątny klucz średnik z plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. int indeks znak równości z średnik.
Linia 7. boolean wDol znak równości true średnik.
Linia 8. while otwórz nawias okrągły indeks otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. zaszyfrowane otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości ciag kropka charAt otwórz nawias okrągły indeks zamknij nawias okrągły średnik.
Linia 10. n plus plus średnik.
Linia 12. if otwórz nawias okrągły z znak równości znak równości 0 kreska pionowa kreska pionowa z znak równości znak równości klucz minus 1 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 13. indeks znak równości indeks plus 2 asterysk otwórz nawias okrągły klucz minus 1 zamknij nawias okrągły średnik.
Linia 14. zamknij nawias klamrowy.
Linia 15. else if otwórz nawias okrągły wDol zamknij nawias okrągły otwórz nawias klamrowy.
Linia 16. indeks znak równości indeks plus 2 asterysk otwórz nawias okrągły klucz minus z minus 1 zamknij nawias okrągły średnik.
Linia 17. wDol znak równości wykrzyknik wDol średnik.
Linia 18. zamknij nawias klamrowy.
Linia 19. else otwórz nawias klamrowy.
Linia 20. indeks znak równości indeks plus 2 asterysk z średnik.
Linia 21. wDol znak równości wykrzyknik wDol średnik.
Linia 22. zamknij nawias klamrowy.
Linia 23. zamknij nawias klamrowy.
Linia 24. zamknij nawias klamrowy.
Linia 26. return new String otwórz nawias okrągły zaszyfrowane zamknij nawias okrągły średnik.
Linia 27. zamknij nawias klamrowy.
static String szyfrujPlotkowo(String ciag, int klucz) {
char[] zaszyfrowane = new char[ciag.length()];
int n = 0;
for(int z = 0; z < klucz; z++) {
int indeks = z;
boolean wDol = true;
while (indeks < ciag.length()) {
zaszyfrowane[n] = ciag.charAt(indeks);
n++;
if(z == 0 || z == klucz - 1) {
indeks = indeks + 2 * (klucz - 1);
}
else if(wDol) {
indeks = indeks + 2 * (klucz - z - 1);
wDol = !wDol;
}
else {
indeks = indeks + 2 * z;
wDol = !wDol;
}
}
}
return new String(zaszyfrowane);
}
Przypadek 1
Jeżeli aktualny indeks znajduje się na pierwszym lub ostatnim piętrze płotka, to pozycja kolejnego indeksu wyliczana jest za pomocą wzoru:
RpfzDnFhXnjUl
Ilustracja dotyczy indeksu. Indeks = indeks + 2 razy (klucz minus 1). Poniżej znajduje się płotek z napisem informatyka. Od litery I wychodzi zielona strzałka do litery R, od R do litery Y, od Y do litery N, od N. Następnie od F do litery A, od litery A do następnej litery A.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Przypadek 2
Jeżeli aktualny indeks znajduje się na piętrze płotka innym niż pierwszy i ostatni oraz kierunek przetwarzania liter w płotku zmierza w dół, to kolejny indeks wyliczany jest za pomocą wzoru:
gdzie klucz to wysokość płotu, a z to jego aktualna wysokość.
Na rysunku oznaczone zostały miejsca, w których rozpatrywany jest ten przypadek.
RogydE5cUMLHi
Ilustracja dotyczy indeksu. Indeks = indeks + 2 razy (klucz minus z). Poniżej znajduje się płotek z napisem informatyka. Od litery N wychodzi niebieska strzałka do litery O, od M do T, od K do F.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Przypadek 3
Jeżeli aktualny indeks znajduje się na piętrze płotka – innym niż pierwszy i ostatni – oraz kierunek przetwarzania liter w płocie zmierza w górę, to kolejny indeks wyliczany jest za pomocą wzoru:
gdzie z to aktualna wysokość płotu.
Na rysunku oznaczone zostały miejsca, w których rozpatrywany jest ten przypadek.
Rkrp396cbGYiZ
Ilustracja dotyczy indeksu. Indeks = indeks + 2 razy z. Poniżej znajduje się płotek z napisem informatyka. Od litery O wychodzi strzałka do litery M, od T do K.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Ważne!
W przypadkach oraz musimy pamiętać o zmianie wartości zmiennej logicznej, odpowiedzialnej za wskazywanie aktualnego kierunku przetwarzania liter. W omawianej implementacji jest to zmienna wDol. Wówczas jej wartość ustawiana jest na przeciwną do aktualnej.
Funkcja deszyfrująca
Zacznijmy od napisania funkcji odpowiadającej za deszyfrowanie. Nadajmy jej nazwę odszyfrujPlotkowo() oraz określmy przyjmowane parametry.
Specyfikacja problemu:
Dane:
szyfrogram – podany przez użytkownika ciąg znaków do odszyfrowania
klucz – klucz, czyli liczba całkowita dodatnia, określająca wysokość płotka
Wynik:
odszyfrowane – odszyfrowany ciąg znaków
Zwracaną wartością będzie odszyfrowany ciąg znaków – String.
Linia 1. static String odszyfrujPlotkowo otwórz nawias okrągły String szyfrogram przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 3. zamknij nawias klamrowy.
static String odszyfrujPlotkowo(String szyfrogram, int klucz) {
}
Deklarujemy tablicę znaków char[] odszyfrowane o długości równej długości szyfrogramu. Posłuży ona do przechowywania ciągu znaków. Będzie również wartością zwracaną z funkcji, po konwersji do odpowiedniego typu. Stworzymy też tablicę char[][] plotek, która będzie odwzorowaniem płotka stosowanego przy szyfrowaniuszyfrowanieszyfrowaniu.
Linia 1. static String odszyfrujPlotkowo otwórz nawias okrągły String szyfrogram przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy odszyfrowane znak równości new char otwórz nawias kwadratowy szyfrogram kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 3. char otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy plotek znak równości new char otwórz nawias kwadratowy klucz zamknij nawias kwadratowy otwórz nawias kwadratowy szyfrogram kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 5. return new String otwórz nawias okrągły odszyfrowane zamknij nawias okrągły średnik.
Linia 6. zamknij nawias klamrowy.
static String odszyfrujPlotkowo(String szyfrogram, int klucz) {
char[] odszyfrowane = new char[szyfrogram.length()];
char[][] plotek = new char[klucz][szyfrogram.length()];
return new String(odszyfrowane);
}
Następnie w tabeli plotek zaznaczamy, w jakich komórkach płotka znalazły się litery pierwotnie szyfrowanego tekstu. W tym celu tworzymy zmienną zapisującą, w jakim wierszu płotka obecnie się znajdujemy, oraz zmienną sygnalizującą, czy mamy poruszać się po wierszach płotka w górę, czy w dół. Konieczne jest również stworzenie pętli do przejścia po kolumnach płotka. Za ich pomocą oznaczymy w tabeli plotek, gdzie podczas szyfrowania znajdowały się litery pierwotnego tekstu.
Linia 1. static String odszyfrujPlotkowo otwórz nawias okrągły String szyfrogram przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy odszyfrowane znak równości new char otwórz nawias kwadratowy szyfrogram kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 3. char otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy plotek znak równości new char otwórz nawias kwadratowy klucz zamknij nawias kwadratowy otwórz nawias kwadratowy szyfrogram kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 5. int wiersz znak równości 0 średnik.
Linia 6. boolean dol znak równości false średnik.
Linia 8. for otwórz nawias okrągły int kolumna znak równości 0 średnik kolumna otwórz nawias ostrokątny szyfrogram kropka length otwórz nawias okrągły zamknij nawias okrągły średnik kolumna plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. plotek otwórz nawias kwadratowy wiersz zamknij nawias kwadratowy otwórz nawias kwadratowy kolumna zamknij nawias kwadratowy znak równości apostrof asterysk apostrof średnik.
Linia 10. zamknij nawias klamrowy.
Linia 12. return new String otwórz nawias okrągły odszyfrowane zamknij nawias okrągły średnik.
Linia 13. zamknij nawias klamrowy.
static String odszyfrujPlotkowo(String szyfrogram, int klucz) {
char[] odszyfrowane = new char[szyfrogram.length()];
char[][] plotek = new char[klucz][szyfrogram.length()];
int wiersz = 0;
boolean dol = false;
for(int kolumna = 0; kolumna < szyfrogram.length(); kolumna++){
plotek[wiersz][kolumna] = '*';
}
return new String(odszyfrowane);
}
Poruszanie się po płotku w poziomie umożliwia pętla for(), pozostaje jeszcze kwestia przemieszczania się po nim w pionie. Wykorzystamy do tego celu stworzoną wcześniej zmienną pomocniczą dol. Jeśli przyjmie ona wartość true, oznacza to, że po oznaczeniu miejsca na płotku powinniśmy przejść wiersz niżej. Analogicznie wartość false oznacza konieczność przejścia wiersz wyżej. Poruszanie się po wierszach płotka jest realizowane poprzez odpowiednie zmiany wartości zmiennej wiersz.
Linia 1. static String odszyfrujPlotkowo otwórz nawias okrągły String szyfrogram przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy odszyfrowane znak równości new char otwórz nawias kwadratowy szyfrogram kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 3. char otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy plotek znak równości new char otwórz nawias kwadratowy klucz zamknij nawias kwadratowy otwórz nawias kwadratowy szyfrogram kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 5. int wiersz znak równości 0 średnik.
Linia 6. boolean dol znak równości false średnik.
Linia 8. for otwórz nawias okrągły int kolumna znak równości 0 średnik kolumna otwórz nawias ostrokątny szyfrogram kropka length otwórz nawias okrągły zamknij nawias okrągły średnik kolumna plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. plotek otwórz nawias kwadratowy wiersz zamknij nawias kwadratowy otwórz nawias kwadratowy kolumna zamknij nawias kwadratowy znak równości apostrof asterysk apostrof średnik.
Linia 11. if otwórz nawias okrągły dol zamknij nawias okrągły otwórz nawias klamrowy.
Linia 12. wiersz znak równości wiersz plus 1 średnik.
Linia 13. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 14. wiersz znak równości wiersz minus 1 średnik.
Linia 15. zamknij nawias klamrowy.
Linia 16. zamknij nawias klamrowy.
Linia 18. return new String otwórz nawias okrągły odszyfrowane zamknij nawias okrągły średnik.
Linia 19. zamknij nawias klamrowy.
Ponieważ płotek jest ograniczony w pionie, musimy mieścić się w jego ramach. Oznacza to, że jeżeli analizowane pole znajduje się w najwyższym wierszu płotka, powinniśmy zacząć poruszać się w dół, a jeśli rozważamy pole w najniższym rzędzie, należy rozpocząć przemieszczanie w górę.
Linia 1. static String odszyfrujPlotkowo otwórz nawias okrągły String szyfrogram przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy odszyfrowane znak równości new char otwórz nawias kwadratowy szyfrogram kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 3. char otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy plotek znak równości new char otwórz nawias kwadratowy klucz zamknij nawias kwadratowy otwórz nawias kwadratowy szyfrogram kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 5. int wiersz znak równości 0 średnik.
Linia 6. boolean dol znak równości false średnik.
Linia 8. for otwórz nawias okrągły int kolumna znak równości 0 średnik kolumna otwórz nawias ostrokątny szyfrogram kropka length otwórz nawias okrągły zamknij nawias okrągły średnik kolumna plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. plotek otwórz nawias kwadratowy wiersz zamknij nawias kwadratowy otwórz nawias kwadratowy kolumna zamknij nawias kwadratowy znak równości apostrof asterysk apostrof średnik.
Linia 11. if otwórz nawias okrągły wiersz znak równości znak równości klucz minus 1 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 12. dol znak równości false średnik.
Linia 13. zamknij nawias klamrowy else if otwórz nawias okrągły wiersz znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 14. dol znak równości true średnik.
Linia 15. zamknij nawias klamrowy.
Linia 17. if otwórz nawias okrągły dol zamknij nawias okrągły otwórz nawias klamrowy.
Linia 18. wiersz znak równości wiersz plus 1 średnik.
Linia 19. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 20. wiersz znak równości wiersz minus 1 średnik.
Linia 21. zamknij nawias klamrowy.
Linia 22. zamknij nawias klamrowy.
Linia 24. return new String otwórz nawias okrągły odszyfrowane zamknij nawias okrągły średnik.
Linia 25. zamknij nawias klamrowy.
Kolejny etap to przejście po płotku (od lewej do prawej, z góry na dół) i wstawienie do oznaczonych uprzednio pól kolejnych liter szyfrogramu. Przejście po płotku zrealizujemy przy użyciu dwóch zagnieżdżonych pętli for(), a kolejne litery szyfrogramu będą wyznaczane za pomocą zmiennej pomocniczej, iterowanej po każdym podstawieniu znaku.
Linia 1. static String odszyfrujPlotkowo otwórz nawias okrągły String szyfrogram przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy odszyfrowane znak równości new char otwórz nawias kwadratowy szyfrogram kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 3. char otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy plotek znak równości new char otwórz nawias kwadratowy klucz zamknij nawias kwadratowy otwórz nawias kwadratowy szyfrogram kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 5. int wiersz znak równości 0 średnik.
Linia 6. boolean dol znak równości false średnik.
Linia 8. for otwórz nawias okrągły int kolumna znak równości 0 średnik kolumna otwórz nawias ostrokątny szyfrogram kropka length otwórz nawias okrągły zamknij nawias okrągły średnik kolumna plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. plotek otwórz nawias kwadratowy wiersz zamknij nawias kwadratowy otwórz nawias kwadratowy kolumna zamknij nawias kwadratowy znak równości apostrof asterysk apostrof średnik.
Linia 11. if otwórz nawias okrągły wiersz znak równości znak równości klucz minus 1 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 12. dol znak równości false średnik.
Linia 13. zamknij nawias klamrowy else if otwórz nawias okrągły wiersz znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 14. dol znak równości true średnik.
Linia 15. zamknij nawias klamrowy.
Linia 17. if otwórz nawias okrągły dol zamknij nawias okrągły otwórz nawias klamrowy.
Linia 18. wiersz znak równości wiersz plus 1 średnik.
Linia 19. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 20. wiersz znak równości wiersz minus 1 średnik.
Linia 21. zamknij nawias klamrowy.
Linia 22. zamknij nawias klamrowy.
Linia 24. int znak znak równości 0 średnik.
Linia 26. 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 27. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny szyfrogram 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 28. if otwórz nawias okrągły plotek otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości znak równości apostrof asterysk apostrof zamknij nawias okrągły otwórz nawias klamrowy.
Linia 29. plotek otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości szyfrogram kropka charAt otwórz nawias okrągły znak zamknij nawias okrągły średnik.
Linia 30. znak znak równości znak plus 1 średnik.
Linia 31. zamknij nawias klamrowy.
Linia 32. zamknij nawias klamrowy.
Linia 33. zamknij nawias klamrowy.
Linia 35. return new String otwórz nawias okrągły odszyfrowane zamknij nawias okrągły średnik.
Linia 36. zamknij nawias klamrowy.
static String odszyfrujPlotkowo(String szyfrogram, int klucz) {
char[] odszyfrowane = new char[szyfrogram.length()];
char[][] plotek = new char[klucz][szyfrogram.length()];
int wiersz = 0;
boolean dol = false;
for(int kolumna = 0; kolumna < szyfrogram.length(); kolumna++){
plotek[wiersz][kolumna] = '*';
if(wiersz == klucz - 1){
dol = false;
} else if (wiersz == 0) {
dol = true;
}
if(dol){
wiersz = wiersz + 1;
} else {
wiersz = wiersz - 1;
}
}
int znak = 0;
for(int i = 0; i < klucz; i++){
for(int j = 0; j < szyfrogram.length(); j++){
if(plotek[i][j] == '*'){
plotek[i][j] = szyfrogram.charAt(znak);
znak = znak + 1;
}
}
}
return new String(odszyfrowane);
}
Ostatnim krokiem jest przejście tak zmodyfikowanego płotka w sposób analogiczny do oznaczania miejsc zajętych na nim przez litery pierwotnie szyfrowanego słowa. Jednak zamiast oznaczać miejsca na płotku, zapiszemy wartości w nich zawarte w kolejnych miejscach tablicy wynikowej, otrzymując w ten sposób odszyfrowany ciąg znaków.
Linia 1. static String odszyfrujPlotkowo otwórz nawias okrągły String szyfrogram przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy odszyfrowane znak równości new char otwórz nawias kwadratowy szyfrogram kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 3. char otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy plotek znak równości new char otwórz nawias kwadratowy klucz zamknij nawias kwadratowy otwórz nawias kwadratowy szyfrogram kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 5. int wiersz znak równości 0 średnik.
Linia 6. boolean dol znak równości false średnik.
Linia 8. for otwórz nawias okrągły int kolumna znak równości 0 średnik kolumna otwórz nawias ostrokątny szyfrogram kropka length otwórz nawias okrągły zamknij nawias okrągły średnik kolumna plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. plotek otwórz nawias kwadratowy wiersz zamknij nawias kwadratowy otwórz nawias kwadratowy kolumna zamknij nawias kwadratowy znak równości apostrof asterysk apostrof średnik.
Linia 11. if otwórz nawias okrągły wiersz znak równości znak równości klucz minus 1 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 12. dol znak równości false średnik.
Linia 13. zamknij nawias klamrowy else if otwórz nawias okrągły wiersz znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 14. dol znak równości true średnik.
Linia 15. zamknij nawias klamrowy.
Linia 17. if otwórz nawias okrągły dol zamknij nawias okrągły otwórz nawias klamrowy.
Linia 18. wiersz znak równości wiersz plus 1 średnik.
Linia 19. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 20. wiersz znak równości wiersz minus 1 średnik.
Linia 21. zamknij nawias klamrowy.
Linia 22. zamknij nawias klamrowy.
Linia 24. int znak znak równości 0 średnik.
Linia 26. 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 27. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny szyfrogram 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 28. if otwórz nawias okrągły plotek otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości znak równości apostrof asterysk apostrof zamknij nawias okrągły otwórz nawias klamrowy.
Linia 29. plotek otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości szyfrogram kropka charAt otwórz nawias okrągły znak zamknij nawias okrągły średnik.
Linia 30. znak znak równości znak plus 1 średnik.
Linia 31. zamknij nawias klamrowy.
Linia 32. zamknij nawias klamrowy.
Linia 33. zamknij nawias klamrowy.
Linia 35. wiersz znak równości 0 średnik.
Linia 37. for otwórz nawias okrągły int kolumna znak równości 0 średnik kolumna otwórz nawias ostrokątny szyfrogram kropka length otwórz nawias okrągły zamknij nawias okrągły średnik kolumna plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 38. odszyfrowane otwórz nawias kwadratowy kolumna zamknij nawias kwadratowy znak równości plotek otwórz nawias kwadratowy wiersz zamknij nawias kwadratowy otwórz nawias kwadratowy kolumna zamknij nawias kwadratowy średnik.
Linia 40. if otwórz nawias okrągły wiersz znak równości znak równości klucz minus 1 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 41. dol znak równości false średnik.
Linia 42. zamknij nawias klamrowy else if otwórz nawias okrągły wiersz znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 43. dol znak równości true średnik.
Linia 44. zamknij nawias klamrowy.
Linia 46. if otwórz nawias okrągły dol zamknij nawias okrągły otwórz nawias klamrowy.
Linia 47. wiersz znak równości wiersz plus 1 średnik.
Linia 48. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 49. wiersz znak równości wiersz minus 1 średnik.
Linia 50. zamknij nawias klamrowy.
Linia 51. zamknij nawias klamrowy.
Linia 53. return new String otwórz nawias okrągły odszyfrowane zamknij nawias okrągły średnik.
Linia 54. zamknij nawias klamrowy.
Zadeklarujmy teraz główną funkcję programu, w której za pomocą klasy Scanner pobierzemy od użytkownika ciąg znaków do zaszyfrowania oraz klucz. Następnie wywołamy utworzone przed chwilą funkcje i wypiszemy w konsoli wynik szyfrowania. W kolejnym kroku ponownie go odszyfrujemy.
Linia 1. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. Scanner scanner znak równości new Scanner otwórz nawias okrągły System kropka in zamknij nawias okrągły średnik.
Linia 3. String doZaszyfrowania znak równości scanner kropka nextLine otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 4. int klucz znak równości scanner kropka nextInt otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 5. String szyfrogram znak równości szyfrujPlotkowo otwórz nawias okrągły doZaszyfrowania przecinek klucz zamknij nawias okrągły średnik.
Linia 6. System kropka out kropka println otwórz nawias okrągły szyfrogram zamknij nawias okrągły średnik.
Linia 7. String odszyfrowanySzyfrogram znak równości odszyfrujPlotkowo otwórz nawias okrągły szyfrogram przecinek klucz zamknij nawias okrągły średnik.
Linia 8. System kropka out kropka println otwórz nawias okrągły odszyfrowanySzyfrogram zamknij nawias okrągły średnik.
Linia 9. zamknij nawias klamrowy.
Przedstawione rozwiązanie jest rozwiązaniem uniwersalnym (działa dla dowolnego klucza i ciągu znaków), jednak ma ono złożoność kwadratową. Jeżeli wiemy, że będziemy szyfrować wyłącznie z wykorzystaniem danego klucza, to możemy stworzyć rozwiązanie o złożoności liniowej. Przykład takiego rozwiązania zostanie zaprezentowany dla klucza o wartości .
Funkcja szyfrująca
Podobnie jak w przypadku rozwiązania uniwersalnego, zaczynamy od stworzenia tablicy do przechowania tworzonego szyfrogramu i napisania instrukcji zwracającej ją na zakończenie funkcji.
Linia 1. static String szyfrujPlotkowo otwórz nawias okrągły String ciag zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy szyfrogram znak równości new char otwórz nawias kwadratowy ciag kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 4. return new String otwórz nawias okrągły szyfrogram zamknij nawias okrągły średnik.
Linia 5. zamknij nawias klamrowy.
static String szyfrujPlotkowo(String ciag) {
char[] szyfrogram = new char[ciag.length()];
return new String(szyfrogram);
}
Kolejnym krokiem jest symulacja przetworzenia każdego poziomu płotka z osobna. Znając z góry klucz, którym będziemy szyfrować, jesteśmy w stanie określić odstępy między literami szyfrowanego ciągu na poszczególnych poziomach płotka oraz pozycje pierwszych elementów poszczególnych poziomów. Wiedzę tę wykorzystamy do zasymulowania tworzenia płotka i uzupełnienia szyfrogramu.
Linia 1. static String szyfrujPlotkowo otwórz nawias okrągły String ciag zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy szyfrogram znak równości new char otwórz nawias kwadratowy ciag kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 4. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus znak równości 4 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. zamknij nawias klamrowy.
Linia 7. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus znak równości 2 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. zamknij nawias klamrowy.
Linia 10. for otwórz nawias okrągły int i znak równości 2 średnik i otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus znak równości 4 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 12. zamknij nawias klamrowy.
Linia 13. return new String otwórz nawias okrągły szyfrogram zamknij nawias okrągły średnik.
Linia 14. zamknij nawias klamrowy.
static String szyfrujPlotkowo(String ciag) {
char[] szyfrogram = new char[ciag.length()];
for(int i = 0; i < ciag.length(); i+= 4) {
}
for(int i = 1; i < ciag.length(); i+= 2) {
}
for(int i = 2; i < ciag.length(); i+= 4) {
}
return new String(szyfrogram);
}
Każda ze stworzonych pętli odpowiedzialna jest za symulację przetwarzania jednego poziomu płotka. Pętle zaczynają iteracjeiteracjaiteracje od pozycji pierwszego elementu poziomu, a iterator zwiększany jest o odstęp między kolejnymi elementami na tym poziomie. Iterator każdej pętli jest ograniczony rozmiarem płotka – długością szyfrowanego ciągu znaków.
Wyznaczamy pozycje, które w szyfrogramie zajmą poszczególne litery – kolejne wartości iteratorów następujących po sobie pętli sygnalizują, która litera szyfrowanego ciągu znaków powinna zostać umieszczona w szyfrogramie jako następna. Ponieważ do przechowywania docelowego szyfrogramu wykorzystujemy tablicę znaków, potrzebna jest zmienna pomocnicza wyznaczająca indeks tablicy, pod który należy wstawić dany znak. Zmienna ta powinna być zwiększana po każdym wstawieniu do szyfrogramu znaku.
Linia 1. static String szyfrujPlotkowo otwórz nawias okrągły String ciag zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy szyfrogram znak równości new char otwórz nawias kwadratowy ciag kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 3. int index znak równości 0 średnik.
Linia 5. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus znak równości 4 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. szyfrogram otwórz nawias kwadratowy index zamknij nawias kwadratowy znak równości ciag kropka charAt otwórz nawias okrągły i zamknij nawias okrągły średnik.
Linia 7. index plus plus średnik.
Linia 8. zamknij nawias klamrowy.
Linia 9. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus znak równości 2 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 10. szyfrogram otwórz nawias kwadratowy index zamknij nawias kwadratowy znak równości ciag kropka charAt otwórz nawias okrągły i zamknij nawias okrągły średnik.
Linia 11. index plus plus średnik.
Linia 12. zamknij nawias klamrowy.
Linia 13. for otwórz nawias okrągły int i znak równości 2 średnik i otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus znak równości 4 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 14. szyfrogram otwórz nawias kwadratowy index zamknij nawias kwadratowy znak równości ciag kropka charAt otwórz nawias okrągły i zamknij nawias okrągły średnik.
Linia 15. index plus plus średnik.
Linia 16. zamknij nawias klamrowy.
Linia 17. return new String otwórz nawias okrągły szyfrogram zamknij nawias okrągły średnik.
Linia 18. zamknij nawias klamrowy.
static String szyfrujPlotkowo(String ciag) {
char[] szyfrogram = new char[ciag.length()];
int index = 0;
for(int i = 0; i < ciag.length(); i+= 4) {
szyfrogram[index] = ciag.charAt(i);
index++;
}
for(int i = 1; i < ciag.length(); i+= 2) {
szyfrogram[index] = ciag.charAt(i);
index++;
}
for(int i = 2; i < ciag.length(); i+= 4) {
szyfrogram[index] = ciag.charAt(i);
index++;
}
return new String(szyfrogram);
}
Ostatnim krokiem jest konwersja tablicy z szyfrogramem do typu String i jej zwrócenie.
Funkcja deszyfrująca
Podobnie jak w przypadku funkcji szyfrującej, pierwszym etapem jest stworzenie tablicy znaków i instrukcji jej zwrócenia (po uprzedniej konwersji).
Linia 1. static String odszyfrujPlotkowo otwórz nawias okrągły String ciag zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy odszyfrowane znak równości new char otwórz nawias kwadratowy ciag kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 4. return new String otwórz nawias okrągły odszyfrowane zamknij nawias okrągły średnik.
Linia 5. zamknij nawias klamrowy.
static String odszyfrujPlotkowo(String ciag) {
char[] odszyfrowane = new char[ciag.length()];
return new String(odszyfrowane);
}
Kolejny krok to utworzenie pętli pozwalających na zasymulowanie przetwarzania płotka.
Linia 1. static String odszyfrujPlotkowo otwórz nawias okrągły String ciag zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy odszyfrowane znak równości new char otwórz nawias kwadratowy ciag kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 4. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus znak równości 4 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. zamknij nawias klamrowy.
Linia 7. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus znak równości 2 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. zamknij nawias klamrowy.
Linia 10. for otwórz nawias okrągły int i znak równości 2 średnik i otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus znak równości 4 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 12. zamknij nawias klamrowy.
Linia 13. return new String otwórz nawias okrągły odszyfrowane zamknij nawias okrągły średnik.
Linia 14. zamknij nawias klamrowy.
static String odszyfrujPlotkowo(String ciag) {
char[] odszyfrowane = new char[ciag.length()];
for(int i = 0; i < ciag.length(); i+= 4) {
}
for(int i = 1; i < ciag.length(); i+= 2) {
}
for(int i = 2; i < ciag.length(); i+= 4) {
}
return new String(odszyfrowane);
}
Kolejne wartości iteratorów pętli wskazują na pozycje w tworzonym ciągu znaków, na których powinny znaleźć się następne litery szyfrogramu. Również w wypadku funkcji deszyfrującej potrzebna jest zmienna pomocnicza, iterowana po każdym przetworzonym znaku. Tym razem wskazuje ona na kolejne znaki szyfrogramu, które powinny zostać wstawione w odszyfrowywany ciąg znaków na pozycje wyznaczone przez iteratory pętli.
Linia 1. static String odszyfrujPlotkowo otwórz nawias okrągły String ciag zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy odszyfrowane znak równości new char otwórz nawias kwadratowy ciag kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 3. int index znak równości 0 średnik.
Linia 5. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus znak równości 4 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. odszyfrowane otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości ciag kropka charAt otwórz nawias okrągły index zamknij nawias okrągły średnik.
Linia 7. index plus plus średnik.
Linia 8. zamknij nawias klamrowy.
Linia 9. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus znak równości 2 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 10. odszyfrowane otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości ciag kropka charAt otwórz nawias okrągły index zamknij nawias okrągły średnik.
Linia 11. index plus plus średnik.
Linia 12. zamknij nawias klamrowy.
Linia 13. for otwórz nawias okrągły int i znak równości 2 średnik i otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus znak równości 4 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 14. odszyfrowane otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości ciag kropka charAt otwórz nawias okrągły index zamknij nawias okrągły średnik.
Linia 15. index plus plus średnik.
Linia 16. zamknij nawias klamrowy.
Linia 17. return new String otwórz nawias okrągły odszyfrowane zamknij nawias okrągły średnik.
Linia 18. zamknij nawias klamrowy.
static String odszyfrujPlotkowo(String ciag) {
char[] odszyfrowane = new char[ciag.length()];
int index = 0;
for(int i = 0; i < ciag.length(); i+= 4) {
odszyfrowane[i] = ciag.charAt(index);
index++;
}
for(int i = 1; i < ciag.length(); i+= 2) {
odszyfrowane[i] = ciag.charAt(index);
index++;
}
for(int i = 2; i < ciag.length(); i+= 4) {
odszyfrowane[i] = ciag.charAt(index);
index++;
}
return new String(odszyfrowane);
}
Funkcja odszyfrowująca zakończona jest konwersją tablicy z odszyfrowanym tekstem do typu String i jego zwróceniem.
Jako ostatnią tworzymy główną funkcję programu, w której przy użyciu klasy Scanner pobieramy od użytkownika tekst do zaszyfrowania. Następnie wywołujemy na wprowadzonym tekście funkcję szyfrującą i wypisujemy wynik. Zaszyfrowany tekst odszyfrowujemy i wypisujemy rezultat, w celu sprawdzenia działania obu stworzonych funkcji.
Linia 1. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. Scanner scanner znak równości new Scanner otwórz nawias okrągły System kropka in zamknij nawias okrągły średnik.
Linia 3. String doZaszyfrowania znak równości scanner kropka nextLine otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 4. String szyfrogram znak równości szyfrujPlotkowo otwórz nawias okrągły doZaszyfrowania zamknij nawias okrągły średnik.
Linia 5. System kropka out kropka println otwórz nawias okrągły szyfrogram zamknij nawias okrągły średnik.
Linia 6. String odszyfrowanySzyfrogram znak równości odszyfrujPlotkowo otwórz nawias okrągły szyfrogram zamknij nawias okrągły średnik.
Linia 7. System kropka out kropka println otwórz nawias okrągły odszyfrowanySzyfrogram zamknij nawias okrągły średnik.
Linia 8. zamknij nawias klamrowy.
Cały kod do szyfrowania ze stałym kluczem wygląda następująco.
Linia 1. import java kropka util kropka Scanner średnik.
Linia 3. public class SzyfrPlotkowy otwórz nawias klamrowy.
Linia 5. static String szyfrujPlotkowo otwórz nawias okrągły String ciag zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. char otwórz nawias kwadratowy zamknij nawias kwadratowy szyfrogram znak równości new char otwórz nawias kwadratowy ciag kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 7. int index znak równości 0 średnik.
Linia 9. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus znak równości 4 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 10. szyfrogram otwórz nawias kwadratowy index zamknij nawias kwadratowy znak równości ciag kropka charAt otwórz nawias okrągły i zamknij nawias okrągły średnik.
Linia 11. index plus plus średnik.
Linia 12. zamknij nawias klamrowy.
Linia 13. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus znak równości 2 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 14. szyfrogram otwórz nawias kwadratowy index zamknij nawias kwadratowy znak równości ciag kropka charAt otwórz nawias okrągły i zamknij nawias okrągły średnik.
Linia 15. index plus plus średnik.
Linia 16. zamknij nawias klamrowy.
Linia 17. for otwórz nawias okrągły int i znak równości 2 średnik i otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus znak równości 4 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 18. szyfrogram otwórz nawias kwadratowy index zamknij nawias kwadratowy znak równości ciag kropka charAt otwórz nawias okrągły i zamknij nawias okrągły średnik.
Linia 19. index plus plus średnik.
Linia 20. zamknij nawias klamrowy.
Linia 21. return new String otwórz nawias okrągły szyfrogram zamknij nawias okrągły średnik.
Linia 22. zamknij nawias klamrowy.
Linia 24. static String odszyfrujPlotkowo otwórz nawias okrągły String ciag zamknij nawias okrągły otwórz nawias klamrowy.
Linia 25. char otwórz nawias kwadratowy zamknij nawias kwadratowy odszyfrowane znak równości new char otwórz nawias kwadratowy ciag kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy średnik.
Linia 26. int index znak równości 0 średnik.
Linia 28. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus znak równości 4 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 29. odszyfrowane otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości ciag kropka charAt otwórz nawias okrągły index zamknij nawias okrągły średnik.
Linia 30. index plus plus średnik.
Linia 31. zamknij nawias klamrowy.
Linia 32. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus znak równości 2 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 33. odszyfrowane otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości ciag kropka charAt otwórz nawias okrągły index zamknij nawias okrągły średnik.
Linia 34. index plus plus średnik.
Linia 35. zamknij nawias klamrowy.
Linia 36. for otwórz nawias okrągły int i znak równości 2 średnik i otwórz nawias ostrokątny ciag kropka length otwórz nawias okrągły zamknij nawias okrągły średnik i plus znak równości 4 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 37. odszyfrowane otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości ciag kropka charAt otwórz nawias okrągły index zamknij nawias okrągły średnik.
Linia 38. index plus plus średnik.
Linia 39. zamknij nawias klamrowy.
Linia 40. return new String otwórz nawias okrągły odszyfrowane zamknij nawias okrągły średnik.
Linia 41. zamknij nawias klamrowy.
Linia 43. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy.
Linia 44. Scanner scanner znak równości new Scanner otwórz nawias okrągły System kropka in zamknij nawias okrągły średnik.
Linia 45. String doZaszyfrowania znak równości scanner kropka nextLine otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 46. String szyfrogram znak równości szyfrujPlotkowo otwórz nawias okrągły doZaszyfrowania zamknij nawias okrągły średnik.
Linia 47. System kropka out kropka println otwórz nawias okrągły szyfrogram zamknij nawias okrągły średnik.
Linia 48. String odszyfrowanySzyfrogram znak równości odszyfrujPlotkowo otwórz nawias okrągły szyfrogram zamknij nawias okrągły średnik.
Linia 49. System kropka out kropka println otwórz nawias okrągły odszyfrowanySzyfrogram zamknij nawias okrągły średnik.
Linia 50. zamknij nawias klamrowy.
Linia 51. zamknij nawias klamrowy.
import java.util.Scanner;
public class SzyfrPlotkowy {
static String szyfrujPlotkowo(String ciag) {
char[] szyfrogram = new char[ciag.length()];
int index = 0;
for(int i = 0; i < ciag.length(); i+= 4) {
szyfrogram[index] = ciag.charAt(i);
index++;
}
for(int i = 1; i < ciag.length(); i+= 2) {
szyfrogram[index] = ciag.charAt(i);
index++;
}
for(int i = 2; i < ciag.length(); i+= 4) {
szyfrogram[index] = ciag.charAt(i);
index++;
}
return new String(szyfrogram);
}
static String odszyfrujPlotkowo(String ciag) {
char[] odszyfrowane = new char[ciag.length()];
int index = 0;
for(int i = 0; i < ciag.length(); i+= 4) {
odszyfrowane[i] = ciag.charAt(index);
index++;
}
for(int i = 1; i < ciag.length(); i+= 2) {
odszyfrowane[i] = ciag.charAt(index);
index++;
}
for(int i = 2; i < ciag.length(); i+= 4) {
odszyfrowane[i] = ciag.charAt(index);
index++;
}
return new String(odszyfrowane);
}
public static void main(String []args){
Scanner scanner = new Scanner(System.in);
String doZaszyfrowania = scanner.nextLine();
String szyfrogram = szyfrujPlotkowo(doZaszyfrowania);
System.out.println(szyfrogram);
String odszyfrowanySzyfrogram = odszyfrujPlotkowo(szyfrogram);
System.out.println(odszyfrowanySzyfrogram);
}
}
Słownik
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
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
szyfrogram
szyfrogram
zaszyfrowana wiadomość
szyfrowanie
szyfrowanie
przekształcanie tekstu jawnego w szyfrogram
tablica ASCII
tablica ASCII
spis kodów znaków wykorzystywany w komputerach
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