Napisz program szyfrujący i deszyfrujący tekst przy użyciu szyfru Cezara. Za jego pomocą zaszyfruj i zdeszyfruj łańcuch znaków zapisany w zmiennej tekst. Przetestuj jego działanie dla alfabetu szyfrowego utworzonego na podstawie łańcucha znaków SYNESTEZJA oraz wiadomości EMANCYPACJA !.
Twój program powinien szyfrować i deszyfrować wyłącznie litery alfabetu łacińskiego. Jeśli w tekście do szyfrowania lub odszyfrowania są małe litery, przekształć je na wielkie. Jeśli w tekście są znaki inne niż litery, należy je pominąć w szyfrowaniu oraz deszyfrowaniu (w łańcuchu znaków powinny pojawić się w niezmienionej formie).
Specyfikacja problemu
Dane:
tekst – łańcuch znaków składający się z wielkich liter alfabetu łacińskiego, spacji, cyfr oraz znaków interpunkcyjnych
klucz – łańcuch znaków składający się z wielkich liter alfabetu łacińskiego
Wynik:
utworzony za pomocą klucza klucz alfabet oraz zaszyfrowany, a następnie odszyfrowany z użyciem klucza klucz łańcuch znaków tekst
R1dCjpwXtFxlW
Wybierz jedno nowe słowo poznane podczas dzisiejszej lekcji i ułóż z nim zdanie.
Wybierz jedno nowe słowo poznane podczas dzisiejszej lekcji i ułóż z nim zdanie.
Polecenie 2
Zapoznaj się z prezentacją i porównaj z nią kod swojego programu.
Rz8Ofk76cvV7v1
Źródło: contentplus/pl sp. z o.o., licencja: CC BY-SA 3.0.
Polecenie 3
Zmodyfikuj ḟunkcje szyfruj oraz deszyfruj tak, by pierwszej literze alfabetu odpowiadała ostatnia litera nowego alfabetu, drugiej – przedostatnia itd.
RXwVHTa2gukUi
Wybierz jedno nowe słowo poznane podczas dzisiejszej lekcji i ułóż z nim zdanie.
Wybierz jedno nowe słowo poznane podczas dzisiejszej lekcji i ułóż z nim zdanie.
Zmodyfikowana funkcja szyfrująca:
Linia 1. public static String szyfruj otwórz nawias okrągły String tekst przecinek String nowyAlfabet przecinek String alfabet zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. StringBuilder zaszyfrowanyTekst znak równości new StringBuilder otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 4. 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 5. char znak znak równości tekst kropka charAt otwórz nawias okrągły i zamknij nawias okrągły średnik.
Linia 6. 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 7. znak minus znak równości 32 średnik.
Linia 8. zamknij nawias klamrowy.
Linia 10. if otwórz nawias okrągły 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 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 11. int indeks znak równości alfabet kropka indexOf otwórz nawias okrągły znak zamknij nawias okrągły średnik.
Linia 12. zaszyfrowanyTekst kropka append otwórz nawias okrągły nowyAlfabet kropka charAt otwórz nawias okrągły nowyAlfabet kropka length otwórz nawias okrągły zamknij nawias okrągły minus 1 minus indeks zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 13. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 14. zaszyfrowanyTekst kropka append otwórz nawias okrągły znak zamknij nawias okrągły średnik.
Linia 15. zamknij nawias klamrowy.
Linia 16. zamknij nawias klamrowy.
Linia 18. return zaszyfrowanyTekst kropka toString otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 19. zamknij nawias klamrowy.
public static String szyfruj(String tekst, String nowyAlfabet, String alfabet) {
StringBuilder zaszyfrowanyTekst = 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')) {
int indeks = alfabet.indexOf(znak);
zaszyfrowanyTekst.append(nowyAlfabet.charAt(nowyAlfabet.length() - 1 - indeks));
} else {
zaszyfrowanyTekst.append(znak);
}
}
return zaszyfrowanyTekst.toString();
}
Zmodyfikowana funkcja deszyfrująca:
Linia 1. public static String deszyfruj otwórz nawias okrągły String tekst przecinek String nowyAlfabet przecinek String alfabet zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. StringBuilder odszyfrowanyTekst znak równości new StringBuilder otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 4. 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 5. char znak znak równości tekst kropka charAt otwórz nawias okrągły i zamknij nawias okrągły średnik.
Linia 6. 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 7. znak minus znak równości 32 średnik.
Linia 8. zamknij nawias klamrowy.
Linia 10. if otwórz nawias okrągły 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 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 11. int indeks znak równości nowyAlfabet kropka indexOf otwórz nawias okrągły znak zamknij nawias okrągły średnik.
Linia 12. odszyfrowanyTekst kropka append otwórz nawias okrągły alfabet kropka charAt otwórz nawias okrągły alfabet kropka length otwórz nawias okrągły zamknij nawias okrągły minus 1 minus indeks zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 13. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 14. odszyfrowanyTekst kropka append otwórz nawias okrągły znak zamknij nawias okrągły średnik.
Linia 15. zamknij nawias klamrowy.
Linia 16. zamknij nawias klamrowy.
Linia 18. return odszyfrowanyTekst kropka toString otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 19. zamknij nawias klamrowy.
public static String deszyfruj(String tekst, String nowyAlfabet, String alfabet) {
StringBuilder odszyfrowanyTekst = 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')) {
int indeks = nowyAlfabet.indexOf(znak);
odszyfrowanyTekst.append(alfabet.charAt(alfabet.length() - 1 - indeks));
} else {
odszyfrowanyTekst.append(znak);
}
}
return odszyfrowanyTekst.toString();
}
Cały kod zmodyfikowanego 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 alfabet znak równości cudzysłów ABCDEFGHIJKLMNOPQRSTUVWXYZ cudzysłów średnik.
Linia 4. String tekst znak równości cudzysłów EMANCYPACJA 1678 wykrzyknik cudzysłów średnik.
Linia 5. String klucz znak równości cudzysłów SYNESTEZJA cudzysłów średnik.
Linia 6. klucz znak równości utworzAlfabet otwórz nawias okrągły klucz przecinek alfabet zamknij nawias okrągły średnik.
Linia 8. System kropka out kropka println otwórz nawias okrągły cudzysłów Utworzony alfabet dwukropek cudzysłów plus klucz zamknij nawias okrągły średnik.
Linia 10. String zaszyfrowanyTekst znak równości szyfruj otwórz nawias okrągły tekst przecinek klucz przecinek alfabet zamknij nawias okrągły średnik.
Linia 11. System kropka out kropka println otwórz nawias okrągły cudzysłów Zaszyfrowany tekst dwukropek cudzysłów plus zaszyfrowanyTekst zamknij nawias okrągły średnik.
Linia 13. String odszyfrowanyTekst znak równości deszyfruj otwórz nawias okrągły zaszyfrowanyTekst przecinek klucz przecinek alfabet zamknij nawias okrągły średnik.
Linia 14. System kropka out kropka println otwórz nawias okrągły cudzysłów Odszyfrowany tekst dwukropek cudzysłów plus odszyfrowanyTekst zamknij nawias okrągły średnik.
Linia 15. zamknij nawias klamrowy.
Linia 17. public static String utworzAlfabet otwórz nawias okrągły String klucz przecinek String alfabet zamknij nawias okrągły otwórz nawias klamrowy.
Linia 18. StringBuilder nowyAlfabet znak równości new StringBuilder otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 20. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny klucz 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 21. char znak znak równości klucz kropka charAt otwórz nawias okrągły i zamknij nawias okrągły średnik.
Linia 22. 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 23. znak minus znak równości 32 średnik.
Linia 24. zamknij nawias klamrowy.
Linia 25. boolean czyIstnieje znak równości false średnik.
Linia 26. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny nowyAlfabet 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 27. if otwórz nawias okrągły znak znak równości znak równości nowyAlfabet kropka charAt otwórz nawias okrągły j zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 28. czyIstnieje znak równości true średnik.
Linia 29. break średnik.
Linia 30. zamknij nawias klamrowy.
Linia 31. zamknij nawias klamrowy.
Linia 32. if otwórz nawias okrągły wykrzyknik czyIstnieje zamknij nawias okrągły otwórz nawias klamrowy.
Linia 33. nowyAlfabet kropka append otwórz nawias okrągły znak zamknij nawias okrągły średnik.
Linia 34. zamknij nawias klamrowy.
Linia 35. zamknij nawias klamrowy.
Linia 37. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny alfabet 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 38. char znak znak równości alfabet kropka charAt otwórz nawias okrągły i zamknij nawias okrągły średnik.
Linia 39. boolean czyIstnieje znak równości false średnik.
Linia 40. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny nowyAlfabet 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 41. if otwórz nawias okrągły znak znak równości znak równości nowyAlfabet kropka charAt otwórz nawias okrągły j zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 42. czyIstnieje znak równości true średnik.
Linia 43. break średnik.
Linia 44. zamknij nawias klamrowy.
Linia 45. zamknij nawias klamrowy.
Linia 46. if otwórz nawias okrągły wykrzyknik czyIstnieje zamknij nawias okrągły otwórz nawias klamrowy.
Linia 47. nowyAlfabet kropka append otwórz nawias okrągły znak zamknij nawias okrągły średnik.
Linia 48. zamknij nawias klamrowy.
Linia 49. zamknij nawias klamrowy.
Linia 51. return nowyAlfabet kropka toString otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 52. zamknij nawias klamrowy.
Linia 54. public static String szyfruj otwórz nawias okrągły String tekst przecinek String nowyAlfabet przecinek String alfabet zamknij nawias okrągły otwórz nawias klamrowy.
Linia 55. StringBuilder zaszyfrowanyTekst znak równości new StringBuilder otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 57. 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 58. char znak znak równości tekst kropka charAt otwórz nawias okrągły i zamknij nawias okrągły średnik.
Linia 59. 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 60. znak minus znak równości 32 średnik.
Linia 61. zamknij nawias klamrowy.
Linia 63. if otwórz nawias okrągły 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 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 64. int indeks znak równości alfabet kropka indexOf otwórz nawias okrągły znak zamknij nawias okrągły średnik.
Linia 65. zaszyfrowanyTekst kropka append otwórz nawias okrągły nowyAlfabet kropka charAt otwórz nawias okrągły nowyAlfabet kropka length otwórz nawias okrągły zamknij nawias okrągły minus 1 minus indeks zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 66. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 67. zaszyfrowanyTekst kropka append otwórz nawias okrągły znak zamknij nawias okrągły średnik.
Linia 68. zamknij nawias klamrowy.
Linia 69. zamknij nawias klamrowy.
Linia 71. return zaszyfrowanyTekst kropka toString otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 72. zamknij nawias klamrowy.
Linia 74. public static String deszyfruj otwórz nawias okrągły String tekst przecinek String nowyAlfabet przecinek String alfabet zamknij nawias okrągły otwórz nawias klamrowy.
Linia 75. StringBuilder odszyfrowanyTekst znak równości new StringBuilder otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 77. 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 78. char znak znak równości tekst kropka charAt otwórz nawias okrągły i zamknij nawias okrągły średnik.
Linia 79. 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 80. znak minus znak równości 32 średnik.
Linia 81. zamknij nawias klamrowy.
Linia 83. if otwórz nawias okrągły 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 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 84. int indeks znak równości nowyAlfabet kropka indexOf otwórz nawias okrągły znak zamknij nawias okrągły średnik.
Linia 85. odszyfrowanyTekst kropka append otwórz nawias okrągły alfabet kropka charAt otwórz nawias okrągły alfabet kropka length otwórz nawias okrągły zamknij nawias okrągły minus 1 minus indeks zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 86. zamknij nawias klamrowy else otwórz nawias klamrowy.
Linia 87. odszyfrowanyTekst kropka append otwórz nawias okrągły znak zamknij nawias okrągły średnik.
Linia 88. zamknij nawias klamrowy.
Linia 89. zamknij nawias klamrowy.
Linia 91. return odszyfrowanyTekst kropka toString otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 92. zamknij nawias klamrowy.
Linia 93. zamknij nawias klamrowy.
public class Main {
public static void main(String[] args) {
String alfabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String tekst = "EMANCYPACJA 1678!";
String klucz = "SYNESTEZJA";
klucz = utworzAlfabet(klucz, alfabet);
System.out.println("Utworzony alfabet: " + klucz);
String zaszyfrowanyTekst = szyfruj(tekst, klucz, alfabet);
System.out.println("Zaszyfrowany tekst: " + zaszyfrowanyTekst);
String odszyfrowanyTekst = deszyfruj(zaszyfrowanyTekst, klucz, alfabet);
System.out.println("Odszyfrowany tekst: " + odszyfrowanyTekst);
}
public static String utworzAlfabet(String klucz, String alfabet) {
StringBuilder nowyAlfabet = new StringBuilder();
for (int i = 0; i < klucz.length(); i++) {
char znak = klucz.charAt(i);
if (znak >= 'a' && znak <= 'z') {
znak -= 32;
}
boolean czyIstnieje = false;
for(int j = 0; j < nowyAlfabet.length(); j++) {
if(znak == nowyAlfabet.charAt(j)) {
czyIstnieje = true;
break;
}
}
if(!czyIstnieje) {
nowyAlfabet.append(znak);
}
}
for (int i = 0; i < alfabet.length(); i++) {
char znak = alfabet.charAt(i);
boolean czyIstnieje = false;
for(int j = 0; j < nowyAlfabet.length(); j++) {
if(znak == nowyAlfabet.charAt(j)) {
czyIstnieje = true;
break;
}
}
if(!czyIstnieje) {
nowyAlfabet.append(znak);
}
}
return nowyAlfabet.toString();
}
public static String szyfruj(String tekst, String nowyAlfabet, String alfabet) {
StringBuilder zaszyfrowanyTekst = 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')) {
int indeks = alfabet.indexOf(znak);
zaszyfrowanyTekst.append(nowyAlfabet.charAt(nowyAlfabet.length() - 1 - indeks));
} else {
zaszyfrowanyTekst.append(znak);
}
}
return zaszyfrowanyTekst.toString();
}
public static String deszyfruj(String tekst, String nowyAlfabet, String alfabet) {
StringBuilder odszyfrowanyTekst = 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')) {
int indeks = nowyAlfabet.indexOf(znak);
odszyfrowanyTekst.append(alfabet.charAt(alfabet.length() - 1 - indeks));
} else {
odszyfrowanyTekst.append(znak);
}
}
return odszyfrowanyTekst.toString();
}
}
Efekt działania programu:
Linia 1. Zaszyfrowany tekst dwukropek RHXGVYDXVLX otwórz nawias ostrokątny span aria minus label znak równości cudzysłów tysiąc sześćset siedemdziesiąt osiem cudzysłów role znak równości cudzysłów math cudzysłów zamknij nawias ostrokątny otwórz nawias ostrokątny math aria minus label znak równości cudzysłów tysiąc sześćset siedemdziesiąt osiem cudzysłów role znak równości cudzysłów math cudzysłów zamknij nawias ostrokątny otwórz nawias ostrokątny mn zamknij nawias ostrokątny 1678 otwórz nawias ostrokątny prawy ukośnik mn zamknij nawias ostrokątny otwórz nawias ostrokątny prawy ukośnik math zamknij nawias ostrokątny otwórz nawias ostrokątny prawy ukośnik span zamknij nawias ostrokątny wykrzyknik.
Linia 2. Odszyfrowany tekst dwukropek EMANCYPACJA otwórz nawias ostrokątny span aria minus label znak równości cudzysłów tysiąc sześćset siedemdziesiąt osiem cudzysłów role znak równości cudzysłów math cudzysłów zamknij nawias ostrokątny otwórz nawias ostrokątny math aria minus label znak równości cudzysłów tysiąc sześćset siedemdziesiąt osiem cudzysłów role znak równości cudzysłów math cudzysłów zamknij nawias ostrokątny otwórz nawias ostrokątny mn zamknij nawias ostrokątny 1678 otwórz nawias ostrokątny prawy ukośnik mn zamknij nawias ostrokątny otwórz nawias ostrokątny prawy ukośnik math zamknij nawias ostrokątny otwórz nawias ostrokątny prawy ukośnik span zamknij nawias ostrokątny wykrzyknik.