/** * Diese Lösung versucht lediglich Konstrukte zu verwenden, die * bereits aus der Vorlesung bekannt sein sollten. Dementsprechend * ist diese Lösung geprägt von Redudanz, was aber nicht weiter * schlimm ist. So werden bspw. keine Hilfsmethoden verwendet. * * Zum besseren Verständnis sind in dieser Lösung neben den * Kommentaren auch die Variablennamen auf Deutsch gewählt. * * Sollten zukünftig auch optimierte Lösungen mit fortgeschritteneren * Konstrukturen und Konzepten gewünscht sein, so lass mich das * gerne wissen. * * @author Stefan Berktold * @email s.berktold@tum.de */ public class XORVerschluesselung extends MiniJava { public static void main(String[] args) { // <1.> Schlüssel und Initialisierungsvektor abfragen: int schluessel = -1; while (schluessel < 0 || schluessel >= 64) schluessel = read("Schlüssel eingeben (0-63):"); int vektor = -1; while (vektor < 0 || vektor >= 64) vektor = read("Vektor eingeben (0-63):"); // <2.> Zu verschlüsselnden Text abfragen: String text = readString("Text eingeben:"); // Überprüfung auf Gültigkeit könnte hier erfolgen, mache // ich aber direkt zusammen in der Schleife in Schritt 3. // <3.> Kodierung: Buchstaben auf Zahlen abbilden: // dazu erstmal ein Array für alle Zeichen erzeugen: int[] kodierung = new int[text.length()]; // und jetzt die Kodierung aller Zeichen eintragen; währenddessen // prüfen, ob Zeichen überhaupt gültig, sonst Fehlermeldung for (int i = 0; i < text.length(); ++i) { char z = text.charAt(i); if (z >= 'a' && z <= 'z') kodierung[i] = z - 'a'; // 0-25 else if (z >= 'A' && z <= 'Z') kodierung[i] = z - 'A' + 26; // 26-51 else if (z >= '0' && z <= '9') kodierung[i] = z - '0' + 52; // 52-61 else if (z == ' ') kodierung[i] = 62; else if (z == '.') kodierung[i] = 63; else { write("Dieser Text enthält ungültige Zeichen!"); return; // beenden (main-Methode verlassen) } } // <4.> Verschlüsselung durchführen und ausgeben: String verschluesselt = ""; int vorgaenger = vektor; for (int i = 0; i < kodierung.length; ++i) { // Verschlüsselung im Array: kodierung[i] ^= schluessel; // zusätzlich für CBC: kodierung[i] ^= vorgaenger; vorgaenger = kodierung[i]; // Dekodieren des verschlüsselten Zeichens (zur Ausgabe): int z = kodierung[i]; // Zeichen if (z <= 25) z += 'a'; else if (z <= 51) z += 'A' - 26; else if (z <= 61) z += '0' - 52; else if (z == 62) z = ' '; else if (z == 63) z = '.'; // Anhängen des Zeichens an den Gesamtstring (davor: int -> char) verschluesselt += (char) z; } write("Verschlüsselt: " + verschluesselt); // <5.> Verschlüsselten Text wieder entschlüsseln: String entschluesselt = ""; // Entschlüsselung analog zur Verschlüsselung (ohne CBC identisch), // allerdings wegen CBC immer den noch verschlüsselten Vorgänger // zwischenspeichern (-> vor der Entschlüsselung): vorgaenger = vektor; // noch verschlüsselter Vorgänger for (int i = 0; i < kodierung.length; ++i) { // speichere mich für meinen Nachfolger zwischen, bevor ich mich entschlüssle: int tmp = kodierung[i]; // Entschlüsseln (und im Array übernehmen): kodierung[i] ^= schluessel; // zusätzlich für CBC: kodierung[i] ^= vorgaenger; vorgaenger = tmp; // jetzt überschreiben // Dekodieren des verschlüsselten Zeichens (zur Ausgabe): int z = kodierung[i]; // Zeichen if (z <= 25) z += 'a'; else if (z <= 51) z += 'A' - 26; else if (z <= 61) z += '0' - 52; else if (z == 62) z = ' '; else if (z == 63) z = '.'; entschluesselt += (char) z; } write("Entschlüsselt: " + entschluesselt); } }