
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
