Uogólniony szyfr Cezara – implementacja w języku Java
W przedstawionej implementacji przyjmiemy następujące założenia:
jako alfabetu jawnego będziemy używali alfabetu łacińskiego zawierającego 26 liter zapisanych za pomocą kodu ASCIIASCIIASCII,
nie uwzględniamy wielkości liter, przed zaszyfrowaniem zamienimy wprowadzony tekst na wielkie litery,
podczas szyfrowania wszystkie znaki niebędące wielkimi literami pozostawiamy w szyfrogramieszyfrogramszyfrogramie,
klucz może być dowolną liczbą całkowitą.
Specyfikacja algorytmu
Polecenie 1
Napisz program, który zaszyfruje podany tekst za pomocą uogólnionego szyfru Cezaraszyfr Cezaraszyfru Cezara i wypisze go na ekranie.
Specyfikacja problemu:
Dane:
tekst – ciąg znaków do zaszyfrowania
klucz – liczba całkowita określająca przesunięcie
Wynik:
ciąg znaków reprezentujący zaszyfrowany tekst
Zaczniemy od zapisania metody szyfruj.
Metoda przyjmie dwa argumenty – tekst oraz klucz.
Ważne!
Dla uproszczenia metody w dalszej części e‑materiału będziemy nazywali funkcjami.
Linia 1. public static String szyfruj otwórz nawias okrągły String tekst przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 3. zamknij nawias klamrowy.
public static String szyfruj(String tekst, int klucz) {
}
Pierwszy argument przyjmowany przez funkcję to łańcuch znaków, który mamy zaszyfrować, drugi – wartość przesunięcia. Pamiętajmy, że przesunięcie może być dowolną liczbą całkowitą.
Ważne!
Uogólniony szyfr Cezara powinien działać niezależnie od wartości klucza. Musimy zatem brać pod uwagę trzy przypadki:
wartość zmiennej klucz jest większa niż ;
wartość zmiennej klucz jest równa ;
wartość zmiennej klucz jest mniejsza od .
Ponieważ klucz w wersji uogólnionej może być dowolną liczbą całkowitą, pierwszym krokiem będzie znormalizowanie go – dzięki temu sprowadzimy go do takiej postaci, że będzie należał do przedziału .
Jak zostało powiedziane, nie musimy rozpisywać dodatkowych instrukcji, ponieważ doprowadziliśmy do normalizacji wartości klucza – zawsze znajduje się w zakresie .
Ważne!
Możemy nie normalizować klucza, ale w takim wypadku musimy rozbudować program o dodatkowe instrukcje (obsługujące różne wartości klucza).
Linia 1. public static String szyfruj otwórz nawias okrągły String tekst przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. klucz znak równości otwórz nawias okrągły klucz procent 26 plus 26 zamknij nawias okrągły procent 26 średnik.
Linia 3. zamknij nawias klamrowy.
public static String szyfruj(String tekst, int klucz) {
klucz = (klucz % 26 + 26) % 26;
}
Przykład 1
klucz
przesunięcie
Tworzymy obiekt StringBuilder. Pozwoli stworzyć łańcuch znaków, który można modyfikować podczas działania programu. To ważne, ponieważ standardowo łańcuchy znaków w języku Java nie pozwalają na modyfikację po ich utworzeniu.
Linia 1. public static String szyfruj otwórz nawias okrągły String tekst przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. klucz znak równości otwórz nawias okrągły klucz procent 26 plus 26 zamknij nawias okrągły procent 26 średnik.
Linia 4. StringBuilder sb znak równości new StringBuilder otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 6. zamknij nawias klamrowy.
public static String szyfruj(String tekst, int klucz) {
klucz = (klucz % 26 + 26) % 26;
StringBuilder sb = new StringBuilder();
}
Założyliśmy, że program nie będzie uwzględniał wielkości liter, zatem przed przystąpieniem do szyfrowania musimy zamienić ewentualne małe litery na wielkie.
Linia 1. public static String szyfruj otwórz nawias okrągły String tekst przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. klucz znak równości otwórz nawias okrągły klucz procent 26 plus 26 zamknij nawias okrągły procent 26 średnik.
Linia 4. StringBuilder sb znak równości new StringBuilder otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 6. 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 7. char znak 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 znak zamknij nawias ostrokątny znak równości apostrof a apostrof ampersant ampersant znak otwórz nawias ostrokątny znak równości apostrof z apostrof zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. znak minus znak równości 32 średnik.
Linia 10. zamknij nawias klamrowy.
Linia 11. zamknij nawias klamrowy.
Linia 12. zamknij nawias klamrowy.
public static String szyfruj(String tekst, int klucz) {
klucz = (klucz % 26 + 26) % 26;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < tekst.length(); i++) {
char znak = tekst.charAt(i);
if (znak >= 'a' && znak <= 'z') {
znak -= 32;
}
}
}
Wykorzystamy pętlę for. Przejrzymy wszystkie znaki w szyfrowanym tekście, by sprawdzić, które z nich są małymi literami. Tworzymy zmienną znak i inicjalizujemy ją, przypisując jej wartość i-tego elementu łańcucha znaków tekst.
W instrukcji warunkowej sprawdzimy, czy wartość kodu ASCII danego znaku szyfrowanego łańcucha znaków zawiera się w zakresie, do którego należą kody ASCII małych liter alfabetu łacińskiego (czyli od a do z).
Jeżeli instrukcja warunkowa zwróci wartość true (warunek jest spełniony, czyli znak jest małą literą), kod zmienia małą literę na dużą literę. W tabeli kodów ASCII duże litery są dokładnie pozycje przed małymi literami, np. kod ASCII dla litery a to , a dla A to . Zatem odejmowanie od kodu małej litery zamienia ją na dużą literę.
Nasz program ma szyfrować wyłącznie litery, zatem inne znaki (spacje, znaki interpunkcyjne oraz cyfry) nie powinny być szyfrowane. Zapiszemy instrukcję warunkową, która będzie sprawdzać, czy dany znak jest wielką literą. Jeśli tak, będzie szyfrowany z użyciem podanego klucza.
Jeśli znak nie będzie wielką literą, czyli jego kod numeryczny nie będzie zawierał się w przedziale kodów numerycznych znaków , nie zostanie zaszyfrowany.
Jeśli natomiast szyfrowany znak jest literą, konieczne jest sprawdzenie wartości klucza, za pomocą którego zostanie zaszyfrowany.
W instrukcji warunkowej rozważamy dwa przypadki.
Pierwszy z nich to sytuacja, w której dodanie wartości klucza do znaku nie przekroczy wartości kodu ASCII litery Z, czyli nie wyjdziemy poza alfabet. W takiej sytuacji klucz jest dodawany do wartości kodu ASCII tego znaku.
Linia 1. public static String szyfruj otwórz nawias okrągły String tekst przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. klucz znak równości otwórz nawias okrągły klucz procent 26 plus 26 zamknij nawias okrągły procent 26 średnik.
Linia 4. StringBuilder sb znak równości new StringBuilder otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 6. 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 7. char znak 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 znak zamknij nawias ostrokątny znak równości apostrof a apostrof ampersant ampersant znak otwórz nawias ostrokątny znak równości apostrof z apostrof zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. znak minus znak równości 32 średnik.
Linia 10. zamknij nawias klamrowy.
Linia 11. if otwórz nawias okrągły znak zamknij nawias ostrokątny znak równości apostrof A apostrof ampersant ampersant znak otwórz nawias ostrokątny znak równości apostrof Z apostrof zamknij nawias okrągły otwórz nawias klamrowy.
Linia 12. if otwórz nawias okrągły znak plus klucz otwórz nawias ostrokątny znak równości apostrof Z apostrof zamknij nawias okrągły.
Linia 13. znak znak równości otwórz nawias okrągły char zamknij nawias okrągły otwórz nawias okrągły znak plus klucz zamknij nawias okrągły średnik.
Linia 14. zamknij nawias klamrowy.
Linia 15. zamknij nawias klamrowy.
Linia 16. zamknij nawias klamrowy.
public static String szyfruj(String tekst, int klucz) {
klucz = (klucz % 26 + 26) % 26;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < tekst.length(); i++) {
char znak = tekst.charAt(i);
if (znak >= 'a' && znak <= 'z') {
znak -= 32;
}
if (znak >= 'A' && znak <= 'Z') {
if (znak + klucz <= 'Z')
znak = (char)(znak + klucz);
}
}
}
Natomiast jeżeli dodanie wartości klucza do znaku przekroczy wartość kodu ASCII litery Z (wyjdziemy z alfabetu), to dodajemy wartość klucza, ale odejmujemy również liczbę (liczbę liter w alfabecie) od wyniku.
Linia 1. public static String szyfruj otwórz nawias okrągły String tekst przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. klucz znak równości otwórz nawias okrągły klucz procent 26 plus 26 zamknij nawias okrągły procent 26 średnik.
Linia 4. StringBuilder sb znak równości new StringBuilder otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 6. 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 7. char znak 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 znak zamknij nawias ostrokątny znak równości apostrof a apostrof ampersant ampersant znak otwórz nawias ostrokątny znak równości apostrof z apostrof zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. znak minus znak równości 32 średnik.
Linia 10. zamknij nawias klamrowy.
Linia 11. if otwórz nawias okrągły znak zamknij nawias ostrokątny znak równości apostrof A apostrof ampersant ampersant znak otwórz nawias ostrokątny znak równości apostrof Z apostrof zamknij nawias okrągły otwórz nawias klamrowy.
Linia 12. if otwórz nawias okrągły znak plus klucz otwórz nawias ostrokątny znak równości apostrof Z apostrof zamknij nawias okrągły.
Linia 13. znak znak równości otwórz nawias okrągły char zamknij nawias okrągły otwórz nawias okrągły znak plus klucz zamknij nawias okrągły średnik.
Linia 14. else.
Linia 15. znak znak równości otwórz nawias okrągły char zamknij nawias okrągły otwórz nawias okrągły znak plus klucz minus 26 zamknij nawias okrągły średnik.
Linia 16. zamknij nawias klamrowy.
Linia 17. zamknij nawias klamrowy.
Linia 18. zamknij nawias klamrowy.
public static String szyfruj(String tekst, int klucz) {
klucz = (klucz % 26 + 26) % 26;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < tekst.length(); i++) {
char znak = tekst.charAt(i);
if (znak >= 'a' && znak <= 'z') {
znak -= 32;
}
if (znak >= 'A' && znak <= 'Z') {
if (znak + klucz <= 'Z')
znak = (char)(znak + klucz);
else
znak = (char)(znak + klucz - 26);
}
}
}
Dodajemy przetworzony znak do obiektu StringBuilder i powtarzamy proces dla wszystkich znaków w tekście
Linia 1. public static String szyfruj otwórz nawias okrągły String tekst przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. klucz znak równości otwórz nawias okrągły klucz procent 26 plus 26 zamknij nawias okrągły procent 26 średnik.
Linia 4. StringBuilder sb znak równości new StringBuilder otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 6. 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 7. char znak 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 znak zamknij nawias ostrokątny znak równości apostrof a apostrof ampersant ampersant znak otwórz nawias ostrokątny znak równości apostrof z apostrof zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. znak minus znak równości 32 średnik.
Linia 10. zamknij nawias klamrowy.
Linia 11. if otwórz nawias okrągły znak zamknij nawias ostrokątny znak równości apostrof A apostrof ampersant ampersant znak otwórz nawias ostrokątny znak równości apostrof Z apostrof zamknij nawias okrągły otwórz nawias klamrowy.
Linia 12. if otwórz nawias okrągły znak plus klucz otwórz nawias ostrokątny znak równości apostrof Z apostrof zamknij nawias okrągły.
Linia 13. znak znak równości otwórz nawias okrągły char zamknij nawias okrągły otwórz nawias okrągły znak plus klucz zamknij nawias okrągły średnik.
Linia 14. else.
Linia 15. znak znak równości otwórz nawias okrągły char zamknij nawias okrągły otwórz nawias okrągły znak plus klucz minus 26 zamknij nawias okrągły średnik.
Linia 16. zamknij nawias klamrowy.
Linia 17. sb kropka append otwórz nawias okrągły znak zamknij nawias okrągły średnik.
Linia 18. zamknij nawias klamrowy.
Linia 19. return sb kropka toString otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 20. zamknij nawias klamrowy.
public static String szyfruj(String tekst, int klucz) {
klucz = (klucz % 26 + 26) % 26;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < tekst.length(); i++) {
char znak = tekst.charAt(i);
if (znak >= 'a' && znak <= 'z') {
znak -= 32;
}
if (znak >= 'A' && znak <= 'Z') {
if (znak + klucz <= 'Z')
znak = (char)(znak + klucz);
else
znak = (char)(znak + klucz - 26);
}
sb.append(znak);
}
return sb.toString();
}
Za pomocą metody toString() dokonujemy konwersji obiektu StrongBuilder, tworząc łańcuch znaków.
Zwracamy łańcuch znaków.
Kod programu
Zdefiniujmy klasę Main oraz metodę main.
Następnie zdefiniujmy i zainicjalizujmy dwie zmienne. Pierwsza zmienna jest typu tekstowego – tekst. Druga zmienna jest typu całkowitoliczbowego – klucz.
W kolejnym kroku wywołujemy metodę szyfruj, przekazując do niej zmienne tekst oraz klucz. Wyświetlamy zaszyfrowany tekst.
Działanie programu przetestujemy dla łańcucha znaków Sklepy cynamonowe t. oraz klucza o wartości .
Cały kod programu:
Linia 1. public class Main otwórz nawias klamrowy.
Linia 2. 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 3. String tekst znak równości cudzysłów Sklepy cynamonowe t kropka 2 cudzysłów średnik.
Linia 4. int klucz znak równości 5 średnik.
Linia 6. tekst znak równości szyfruj otwórz nawias okrągły tekst przecinek klucz zamknij nawias okrągły średnik.
Linia 8. System kropka out kropka println otwórz nawias okrągły tekst zamknij nawias okrągły średnik.
Linia 9. zamknij nawias klamrowy.
Linia 11. public static String szyfruj otwórz nawias okrągły String tekst przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 12. klucz znak równości otwórz nawias okrągły klucz procent 26 plus 26 zamknij nawias okrągły procent 26 średnik.
Linia 14. StringBuilder sb znak równości new StringBuilder otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 16. 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 17. char znak znak równości tekst kropka charAt otwórz nawias okrągły i zamknij nawias okrągły średnik.
Linia 18. if otwórz nawias okrągły znak zamknij nawias ostrokątny znak równości apostrof a apostrof ampersant ampersant znak otwórz nawias ostrokątny znak równości apostrof z apostrof zamknij nawias okrągły otwórz nawias klamrowy.
Linia 19. znak minus znak równości 32 średnik.
Linia 20. zamknij nawias klamrowy.
Linia 21. if otwórz nawias okrągły znak zamknij nawias ostrokątny znak równości apostrof A apostrof ampersant ampersant znak otwórz nawias ostrokątny znak równości apostrof Z apostrof zamknij nawias okrągły otwórz nawias klamrowy.
Linia 22. if otwórz nawias okrągły znak plus klucz otwórz nawias ostrokątny znak równości apostrof Z apostrof zamknij nawias okrągły.
Linia 23. znak znak równości otwórz nawias okrągły char zamknij nawias okrągły otwórz nawias okrągły znak plus klucz zamknij nawias okrągły średnik.
Linia 24. else.
Linia 25. znak znak równości otwórz nawias okrągły char zamknij nawias okrągły otwórz nawias okrągły znak plus klucz minus 26 zamknij nawias okrągły średnik.
Linia 27. zamknij nawias klamrowy.
Linia 28. sb kropka append otwórz nawias okrągły znak zamknij nawias okrągły średnik.
Linia 29. zamknij nawias klamrowy.
Linia 31. return sb kropka toString otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 32. zamknij nawias klamrowy.
Linia 34. zamknij nawias klamrowy.
public class Main {
public static void main(String[] args) {
String tekst = "Sklepy cynamonowe t. 2";
int klucz = 5;
tekst = szyfruj(tekst, klucz);
System.out.println(tekst);
}
public static String szyfruj(String tekst, int klucz) {
klucz = (klucz % 26 + 26) % 26;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < tekst.length(); i++) {
char znak = tekst.charAt(i);
if (znak >= 'a' && znak <= 'z') {
znak -= 32;
}
if (znak >= 'A' && znak <= 'Z') {
if (znak + klucz <= 'Z')
znak = (char)(znak + klucz);
else
znak = (char)(znak + klucz - 26);
}
sb.append(znak);
}
return sb.toString();
}
}
Wynik działania programu: XPQJUD HDSFRTSTBJ Y.
Deszyfrowanie
Z tego wynika, że deszyfrowanie to operacja odwrotna do szyfrowania i polega na przesuwaniu znaku w zapętlonym alfabecie w odwrotnym kierunku niż podczas szyfrowania.
Funkcja deszyfrująca wygląda następująco:
Linia 1. public static String deszyfruj otwórz nawias okrągły String tekst przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. klucz znak równości otwórz nawias okrągły klucz procent 26 plus 26 zamknij nawias okrągły procent 26 średnik.
Linia 4. StringBuilder sb znak równości new StringBuilder otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 6. 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 7. char znak 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 znak zamknij nawias ostrokątny znak równości apostrof A apostrof ampersant ampersant znak otwórz nawias ostrokątny znak równości apostrof Z apostrof zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. if otwórz nawias okrągły znak minus klucz zamknij nawias ostrokątny znak równości apostrof A apostrof zamknij nawias okrągły.
Linia 10. znak minus znak równości klucz średnik.
Linia 11. else.
Linia 12. znak znak równości otwórz nawias okrągły char zamknij nawias okrągły otwórz nawias okrągły znak minus klucz plus 26 zamknij nawias okrągły średnik.
Linia 13. zamknij nawias klamrowy.
Linia 14. sb kropka append otwórz nawias okrągły znak zamknij nawias okrągły średnik.
Linia 15. zamknij nawias klamrowy.
Linia 17. return sb kropka toString otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 18. zamknij nawias klamrowy.
public static String deszyfruj(String tekst, int klucz) {
klucz = (klucz % 26 + 26) % 26;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < tekst.length(); i++) {
char znak = tekst.charAt(i);
if (znak >= 'A' && znak <= 'Z') {
if (znak - klucz >= 'A')
znak -= klucz;
else
znak = (char)(znak - klucz + 26);
}
sb.append(znak);
}
return sb.toString();
}
Jej wywołanie odbywa się z użyciem tego samego klucza, co w funkcji szyfrującej:
Kompletny kod programu, który najpierw zaszyfruje łańcuch znaków, a następnie go odszyfruje:
Linia 1. public class Main otwórz nawias klamrowy.
Linia 2. 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 3. String tekst znak równości cudzysłów Sklepy cynamonowe t kropka 2 cudzysłów średnik.
Linia 4. int klucz znak równości 5 średnik.
Linia 6. tekst znak równości szyfruj otwórz nawias okrągły tekst przecinek klucz zamknij nawias okrągły średnik.
Linia 7. System kropka out kropka println otwórz nawias okrągły cudzysłów Zaszyfrowany tekst dwukropek cudzysłów plus tekst zamknij nawias okrągły średnik.
Linia 9. tekst znak równości deszyfruj otwórz nawias okrągły tekst przecinek klucz zamknij nawias okrągły średnik.
Linia 10. System kropka out kropka println otwórz nawias okrągły cudzysłów Odszyfrowany tekst dwukropek cudzysłów plus tekst zamknij nawias okrągły średnik.
Linia 11. zamknij nawias klamrowy.
Linia 13. public static String szyfruj otwórz nawias okrągły String tekst przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 14. klucz znak równości otwórz nawias okrągły klucz procent 26 plus 26 zamknij nawias okrągły procent 26 średnik.
Linia 16. StringBuilder sb znak równości new StringBuilder otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 18. 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 19. char znak znak równości tekst kropka charAt otwórz nawias okrągły i zamknij nawias okrągły średnik.
Linia 20. if otwórz nawias okrągły znak zamknij nawias ostrokątny znak równości apostrof a apostrof ampersant ampersant znak otwórz nawias ostrokątny znak równości apostrof z apostrof zamknij nawias okrągły otwórz nawias klamrowy.
Linia 21. znak minus znak równości 32 średnik.
Linia 22. zamknij nawias klamrowy.
Linia 23. if otwórz nawias okrągły znak zamknij nawias ostrokątny znak równości apostrof A apostrof ampersant ampersant znak otwórz nawias ostrokątny znak równości apostrof Z apostrof zamknij nawias okrągły otwórz nawias klamrowy.
Linia 24. if otwórz nawias okrągły znak plus klucz otwórz nawias ostrokątny znak równości apostrof Z apostrof zamknij nawias okrągły.
Linia 25. znak znak równości otwórz nawias okrągły char zamknij nawias okrągły otwórz nawias okrągły znak plus klucz zamknij nawias okrągły średnik.
Linia 26. else.
Linia 27. znak znak równości otwórz nawias okrągły char zamknij nawias okrągły otwórz nawias okrągły znak plus klucz minus 26 zamknij nawias okrągły średnik.
Linia 28. zamknij nawias klamrowy.
Linia 29. sb kropka append otwórz nawias okrągły znak zamknij nawias okrągły średnik.
Linia 30. zamknij nawias klamrowy.
Linia 32. return sb kropka toString otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 33. zamknij nawias klamrowy.
Linia 35. public static String deszyfruj otwórz nawias okrągły String tekst przecinek int klucz zamknij nawias okrągły otwórz nawias klamrowy.
Linia 36. klucz znak równości otwórz nawias okrągły klucz procent 26 plus 26 zamknij nawias okrągły procent 26 średnik.
Linia 38. StringBuilder sb znak równości new StringBuilder otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 40. 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 41. char znak znak równości tekst kropka charAt otwórz nawias okrągły i zamknij nawias okrągły średnik.
Linia 42. if otwórz nawias okrągły znak zamknij nawias ostrokątny znak równości apostrof A apostrof ampersant ampersant znak otwórz nawias ostrokątny znak równości apostrof Z apostrof zamknij nawias okrągły otwórz nawias klamrowy.
Linia 43. if otwórz nawias okrągły znak minus klucz zamknij nawias ostrokątny znak równości apostrof A apostrof zamknij nawias okrągły.
Linia 44. znak minus znak równości klucz średnik.
Linia 45. else.
Linia 46. znak znak równości otwórz nawias okrągły char zamknij nawias okrągły otwórz nawias okrągły znak minus klucz plus 26 zamknij nawias okrągły średnik.
Linia 47. zamknij nawias klamrowy.
Linia 48. sb kropka append otwórz nawias okrągły znak zamknij nawias okrągły średnik.
Linia 49. zamknij nawias klamrowy.
Linia 51. return sb kropka toString otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 52. zamknij nawias klamrowy.
Linia 53. zamknij nawias klamrowy.
public class Main {
public static void main(String[] args) {
String tekst = "Sklepy cynamonowe t. 2";
int klucz = 5;
tekst = szyfruj(tekst, klucz);
System.out.println("Zaszyfrowany tekst: " + tekst);
tekst = deszyfruj(tekst, klucz);
System.out.println("Odszyfrowany tekst: " + tekst);
}
public static String szyfruj(String tekst, int klucz) {
klucz = (klucz % 26 + 26) % 26;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < tekst.length(); i++) {
char znak = tekst.charAt(i);
if (znak >= 'a' && znak <= 'z') {
znak -= 32;
}
if (znak >= 'A' && znak <= 'Z') {
if (znak + klucz <= 'Z')
znak = (char)(znak + klucz);
else
znak = (char)(znak + klucz - 26);
}
sb.append(znak);
}
return sb.toString();
}
public static String deszyfruj(String tekst, int klucz) {
klucz = (klucz % 26 + 26) % 26;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < tekst.length(); i++) {
char znak = tekst.charAt(i);
if (znak >= 'A' && znak <= 'Z') {
if (znak - klucz >= 'A')
znak -= klucz;
else
znak = (char)(znak - klucz + 26);
}
sb.append(znak);
}
return sb.toString();
}
}
Wynik działania programu:
Linia 1. Zaszyfrowany tekst dwukropek XPQJUD HDSFRTSTBJ Y kropka 2.
Linia 2. Odszyfrowany tekst dwukropek SKLEPY CYNAMONOWE T kropka 2.
Zaszyfrowany tekst: XPQJUD HDSFRTSTBJ Y. 2
Odszyfrowany tekst: SKLEPY CYNAMONOWE T. 2
Słownik
ASCII
ASCII
sposób kodowania znaków, który różnym znakom, w tym małym i wielkim literom alfabetu języka łacińskiego, cyfrom, znakom przestankowym i białym, przyporządkowuje liczby całkowite z zakresu
normalizacja
normalizacja
proces, którego celem jest takie przekształcenie klucza, by należał do zakresu
szyfr Cezara
szyfr Cezara
rodzaj szyfru podstawieniowego, w którym każda litera tekstu jawnego (niezaszyfrowanego) zastępowana jest inną – oddaloną od niej o stałą liczbę pozycji w alfabecie – literą (szyfr monoalfabetyczny), przy czym kierunek zamiany musi być zachowany
szyfrogram
szyfrogram
(inaczej: kryptogram, tekst tajny) wiadomość, która została zaszyfrowana (lub jeszcze nie została odszyfrowana)
tekst jawny
tekst jawny
(inaczej: tekst otwarty) wiadomość, która nie została jeszcze zaszyfrowana (lub została odszyfrowana)