Szyfr Cezara
Prosty szyfr przestawny (przesuwający). Znak w tekście jest zastępowany przez inny znak przy zachowaniu określonego przesunięcia (na przykład: 3) i kierunku (na przykład w prawo). Zwyczajowo kierunek jest zawsze w prawo. Współcześnie używa się przesunięcia 13. Szyfr jest dzisiaj uważany za dziecinnie łatwy do złamania.
Juliusz Cezar stosował przesunięcie 3 i kierunek w prawo.
Matematycznie szyfrowanie można zdefiniować jako kongruencję:
Deszyfrowanie może być określone jako:
Klasa SzyfrCezara
package crypto.szyfrcezara; class SzyfrCezara { private static final String[] litery = {"A", "Ą", "B", "C", "Ć", "D", "E", "Ę", "F", "G", "H", "I", "J", "K", "L", "Ł", "M", "N", "Ń", "O", "Ó", "P", "Q", "R", "S", "Ś", "T", "U", "V", "W", "X", "Y", "Z", "Ź", "Ż"}; private static final int len = litery.length; private static String encodeChar(String znak, int step) { int index = 0; for (int i = 0; i < len; i++) { if (znak.equalsIgnoreCase(litery[i])) { index = (i + step) % len; break; } if (znak.equals(" ") | znak.equals(",")) { return znak; } } return litery[index]; } private static String decodeChar(String znak, int step) { int index = 0; for (int i = 0; i < len; i++) { if (znak.equalsIgnoreCase(litery[i])) { index = i - step; if (index < 0) { index = len + index; } break; } if (znak.equals(" ") | znak.equals(",")) { return znak; } } return litery[index]; } private static String encodeMessage(String message, int step) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < message.length(); i++) { sb.append(encodeChar(message.substring(i, i + 1), step)); } return sb.toString(); } private static String decodeMessage(String message, int step) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < message.length(); i++) { sb.append(decodeChar(message.substring(i, i + 1), step)); } return sb.toString(); } public static void main(String[] args) { String str = "MĘŻNY BĄDŹ, CHROŃ PUŁK TWÓJ I SZEŚĆ FLAG ORAZ WODZA"; System.out.println(str); String enc = encodeMessage(str,13); System.out.println(enc); String dec = decodeMessage(enc,13); System.out.println(dec); } }
Wynik
Po uruchomieniu otrzymujemy
MĘŻNY BĄDŹ, CHROŃ PUŁK TWÓJ I SZEŚĆ FLAG ORAZ WODZA WÓJXG ŁLŃI, MRĄZY ŻDVT ĆĘŹŚ S BHOCN PUKQ ZĄKH ĘZŃHK MĘŻNY BĄDŹ, CHROŃ PUŁK TWÓJ I SZEŚĆ FLAG ORAZ WODZA
Zadanie bojowe
A teraz odczytaj wiadomość od Arii (step: 13).
HŁSOĄKW TKBÓ XK UOŻBHO MRĄDŻTS
Uwagi do mojej implementacji
Umożliwia łatwą zmianę tablicy dostępnych znaków. Na przykład można ustalić inny porządek znaków w tablicy, pod warunkiem – oczywiście – że odbiorca wiadomości zna ten porządek.