
Szyfr XOR
Więcej teorii przedstawiono we wpisie Szyfr
        XOR-Vernama-Vigenere’a (1)
Szyfr binarny. Szyfr typu one-time-pad, czyli szyfr jednokrotny. Pokazuję tutaj działający algorytm, ale bez rozbicia na metody kodujące i dekodujące. Szyfr pozwala na użycie polskich liter i innych znaków powszechnie używanych.
Klasa SzyfrXORTest
package szyfrxor; import java.nio.*; import java.nio.charset.*; class SzyfrXORTest { private static final String KLUCZ = "Litwo Ojczyzno moja Ty jesteś jak zdrowie. Ile cię\n" + " trzeba cenic, ten tylko "; private static final String WIADOMOSC = "W Strzebrzeszynie chrząszcz brzmi w trzcinie i \n" + "Strzebrzeszyn z tego słynie."; private static String byteArrayToString(byte[] tabl) { Charset charset = Charset.forName("UTF-8"); ByteBuffer buf = ByteBuffer.wrap(tabl); CharBuffer cbuf = charset.decode(buf); return cbuf.toString(); } public static void main(String[] args) { byte[] bwiad; byte[] bklucz; byte[] zaszyfr; byte[] odszyfr; bwiad = WIADOMOSC.getBytes(StandardCharsets.UTF_8); bklucz = KLUCZ.getBytes(StandardCharsets.UTF_8); zaszyfr = new byte[bwiad.length]; odszyfr = new byte[bwiad.length]; for (int i = 0; i < bwiad.length; i++) { zaszyfr[i] = (byte) ((bwiad[i]) ^ (bklucz[i])); } for (int i = 0; i < bwiad.length; i++) { odszyfr[i] = (byte) ((zaszyfr[i]) ^ (bklucz[i])); } String fwiad = byteArrayToString(bwiad); System.out.println("wiad: " + fwiad); //- String fklucz = byteArrayToString(bklucz); System.out.println("klucz: " + fklucz); //- String zasz = byteArrayToString(zaszyfr); System.out.println("zaszyfr: " + zasz); //- String odszy = byteArrayToString(odszyfr); System.out.println("odszyfr: " + odszy); } }
Wynik
wiad: W Strzebrzeszynie chrząszcz brzmi w trzcinie i Strzebrzeszyn z tego słynie. klucz: Litwo Ojczyzno moja Ty jesteś jak zdrowie. Ile cię trzeba cenic, ten tylko zaszyfr: I'Z N D EIIGE�� odszyfr: W Strzebrzeszynie chrząszcz brzmi w trzcinie i Strzebrzeszyn z tego słynie.
Metody pomocnicze
Jeśli wiadomości i klucze mają być odczytywane z pliku i zapisywane do pliku – możesz użyć poniższych metod.
public static void writeFile(String wiad, String plik) {
        File file = new File(plik);
        BufferedWriter bw = null;
        try{
            bw = new BufferedWriter(new FileWriter(file));
        } catch (IOException e1){
            e1.printStackTrace();
        }
        try{
            bw.write(wiad);
            bw.close();
        } catch (IOException e){
            e.printStackTrace();
        }
    }
    public static String readFile(String file) {
        StringBuilder buf = new StringBuilder();
        BufferedReader we = null;
        try{
            we = new BufferedReader(new FileReader(file));
        } catch (FileNotFoundException e){
            e.printStackTrace();
        }
        String linia;
        try{
            while((linia = we.readLine()) != null){
                buf.append(linia);
            }
        } catch (IOException e){
            e.printStackTrace();
        }
        return buf.toString();
    }
Uwagi
Operator binarny XOR był przedstawiony w Klasa java.util.BitSet

