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