Auch bei diesem Verfahren setze ich „Verschlüsselung“ in Klammern, denn das Verfahren ist mehr als einfach und kann sehr schnell geknackt werden.
Was ist eine XOR-„Verschlüsselung“ oder Kodierung ? XOR ist ein mathematischer Operator welcher eine ganz einfache Berechnung durchführt. Die nachfolgende Aufstellung zeigt Dir die 4 möglichen Berechnungen auf Basis von Bits, welche den Zustand 0 oder 1 annehmen können. Da ich den Bit-Zustand von 2 Bits (Bit A und Bit B) miteinander verknüpfe ergeben sich diese 4 Ergebnisse:
Das bedeutet: sind die beiden Bits gleich („0 / 0“ oder „1 / 1“) ist das Ergebnis ein „0“, bei ungleichen Bits („1 / 0“ oder „0 / 1“) ergibt sich als Ergebnis eine „1“. Da in einem Computer die einzelnen Zeichen in Bytes gespeichert werden, welche sich aus Bits zusammensetzen, kann ich einen plaintext mit einem Schlüssel xor-kodieren und auch wieder dekodieren.
Im nachfolgenden Beispiel „verschlüssel“ ich den plaintext „“HalloWelt0123456“ mit dem Buchstaben „h“, wobei ich im ersten Teil nur den ersten Buchstaben „H“ einer XOR-Berechnung mit „h“ unterziehe und die Werte sowohl in dezimaler, hexadezimaler und bitweiser Darstellung ausgebe, um die XOR-Berechnung darzustellen. Der zweite Block unterzieht dann den ganzen plaintext der XOR-Kodierung.
Bitte die nachfolgende Routine nicht für den Echteinsatz nutzen, da sie aus kryptographischer Sicht sehr angreifbar ist !
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
package net.bplaced.javacrypto.symmetricencryption; /* * Herkunft/Origin: http://javacrypto.bplaced.net/ * Programmierer/Programmer: Michael Fehr * Copyright/Copyright: frei verwendbares Programm (Public Domain) * Copyright: This is free and unencumbered software released into the public domain. * Lizenttext/Licence: <http://unlicense.org> * getestet mit/tested with: Java Runtime Environment 8 Update 181 x64 * Datum/Date (dd.mm.jjjj): 27.09.2018 * Funktion: einfache Demonstration der XOR-Kodierung * Function: simple demonstration of the XOR-codec * * Sicherheitshinweis/Security notice * Die Programmroutinen dienen nur der Darstellung und haben keinen Anspruch auf eine * korrekte Funktion, insbesondere mit Blick auf die Sicherheit ! * Prüfen Sie die Sicherheit bevor das Programm in der echten Welt eingesetzt wird. * The program routines just show the function but please be aware of the security part - * check yourself before using in the real world ! */ import java.io.UnsupportedEncodingException; import javax.xml.bind.DatatypeConverter; public class B02_XorCodec { public static void main(String[] args) throws UnsupportedEncodingException { System.out.println("B02 XOR Kodierung"); // es werden ein paar variablen benötigt: char xorCodecChar = 'h'; // mit diesem Wert wird xor-kodiert String plaintextString = "HalloWelt0123456"; int plaintextLengthInt = plaintextString.length(); // länge des plaintextString byte[] plaintextByte = new byte[plaintextLengthInt]; // das plaintextByte array erzeugen plaintextByte = plaintextString.getBytes("UTF-8"); // plaintextString in das byte array bringen // beispiel der xor-kodierung anhand des ersten buchstabens von plaintextString System.out.println(""); System.out.println("= = = XOR-Kodierung anhand des ersten Buchstabens = = ="); System.out.println("xorCodecChar :" + xorCodecChar); System.out.println("plaintextString :" + plaintextString); // hier die bit-darstellung der xor-kodierung des ersten // plaintextString-Buchstabens int xorCodecInt = xorCodecChar; // "h" System.out.println("xorCodecChar Zeichen: " + (char) xorCodecInt + " Int: " + xorCodecInt + " Hex: " + Integer.toHexString(xorCodecInt) + " Bit:" + intToString(xorCodecInt, 4)); int plaintextInt = plaintextByte[0]; // "H" System.out.println("plaintextString Zeichen: " + (char) plaintextInt + " Int: " + plaintextInt + " Hex: " + Integer.toHexString(plaintextInt) + " Bit:" + intToString(plaintextInt, 4)); // hier folgt die xor-kodierung des einzelnen zeichens int ciphertextInt = plaintextInt ^ xorCodecInt; System.out.println("xor-Kodierung Zeichen: " + (char) ciphertextInt + " Int: " + ciphertextInt + " Hex: " + Integer.toHexString(ciphertextInt) + " Bit:" + intToString(ciphertextInt, 4)); // verschlüsselung des gesamten plaintextString System.out.println(""); System.out.println("= = = XOR-Kodierung des gesamten plaintextString = = ="); int cipherInt = 0; // ein einzelnes zeichen byte[] ciphertextByte = new byte[plaintextLengthInt]; // das ciphertextByte array erzeugen for (int i = 0; i < plaintextLengthInt; i++) { cipherInt = plaintextByte[i]; cipherInt = cipherInt ^ xorCodecChar; // hier erfolgt die xor-kodierung ciphertextByte[i] = (byte) cipherInt; } // das ciphertextByte wird an den empfänger gesendet und dort entschlüsselt // entschlüsselung int ciphertextLengthInt = ciphertextByte.length; // länge des ciphertextByte arrays int decryptedInt = 0; // ein einzelnes zeichen byte[] decryptedtextByte = new byte[ciphertextLengthInt]; for (int i = 0; i < ciphertextLengthInt; i++) { decryptedInt = ciphertextByte[i]; decryptedInt = decryptedInt ^ xorCodecChar; // hier erfolgt die xor-(de-)kodierung decryptedtextByte[i] = (byte) decryptedInt; } String decryptedtextString = new String(decryptedtextByte, "UTF-8"); // ausgabe der variablen System.out.println("xorCodecChar :" + xorCodecChar); System.out.println("plaintextString :" + plaintextString); System.out.println("plaintextByte (hex) :" + DatatypeConverter.printHexBinary(plaintextByte)); System.out.println("= = = Verschlüsselung = = ="); System.out.println("ciphertextByte (hex) :" + DatatypeConverter.printHexBinary(ciphertextByte)); System.out.println("= = = Entschlüsselung = = ="); System.out.println("decryptedtextByte (hex):" + DatatypeConverter.printHexBinary(decryptedtextByte)); System.out.println("decryptedtextString :" + decryptedtextString); } /** * Converts an integer to a 32-bit binary string * * @param number The number to convert * @param groupSize The number of bits in a group * @return The 32-bit long bit string * https://stackoverflow.com/questions/5263187/print-an-integer-in-binary-format-in-java */ public static String intToString(int number, int groupSize) { StringBuilder result = new StringBuilder(); for (int i = 31; i >= 0; i--) { int mask = 1 << i; result.append((number & mask) != 0 ? "1" : "0"); if (i % groupSize == 0) result.append(" "); } result.replace(result.length() - 1, result.length(), ""); return result.toString(); } } |
Die Werte in der Konsole findet Ihr hier:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
B02 XOR Kodierung = = = XOR-Kodierung anhand des ersten Buchstabens = = = xorCodecChar :h plaintextString :HalloWelt0123456 xorCodecChar Zeichen: h Int: 104 Hex: 68 Bit:0000 0000 0000 0000 0000 0000 0110 1000 plaintextString Zeichen: H Int: 72 Hex: 48 Bit:0000 0000 0000 0000 0000 0000 0100 1000 xor-Kodierung Zeichen: Int: 32 Hex: 20 Bit:0000 0000 0000 0000 0000 0000 0010 0000 = = = XOR-Kodierung des gesamten plaintextString = = = xorCodecChar :h plaintextString :HalloWelt0123456 plaintextByte (hex) :48616C6C6F57656C7430313233343536 = = = Verschlüsselung = = = ciphertextByte (hex) :20090404073F0D041C58595A5B5C5D5E = = = Entschlüsselung = = = decryptedtextByte (hex):48616C6C6F57656C7430313233343536 decryptedtextString :HalloWelt0123456 |
Die Lizenz zum obigen Beispiel findet Ihr auf der eigenen Lizenz-Seite.
Letzte Aktualisierung: 08.11.2018