Aria

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ę:

Kongruencja szyfrująca
Rys. 145. Kongruencja szyfrująca

Deszyfrowanie może być określone jako:

Kongruencja deszyfrująca
Rys. 146. Kongruencja deszyfrująca

Więcej o kongruencjach.

Klasa SzyfrCezara

Ściągnij klasę SzyfrCezara.zip

package crypto.szyfrcezara;
/**
 * Klasa użyta we wpisie projektu 'javer': 'szyfr_cezara.html'
 */
public 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];
    }

    public 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();
    }

    public 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.