Zielony Smok - logo witryny

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