2017-11-16 5 views
1

Ich habe versucht, die einfache Caesar-Verschlüsselung durch Verschlüsseln im CBC-Modus zu "verbessern".Caesar in CBC/Wie XOR in Java?

Wie ich verstehe, muss das erste Zeichen durch einen Initialisierungsvektor XORed werden und dann durch den Schlüssel, die Ausgabe ist dann das erste Zeichen des verschlüsselten Textes. Dies wird dann durch das zweite Zeichen XOR-verknüpft, dann erneut mit dem Schlüssel XOR-verknüpft, ... und so fort.

Ich verstehe nicht ganz, wie das XORing funktionieren sollte.

Lassen Sie uns die Übersetzungstabelle haben angegeben (nur Raum und AZ): /s: 0, A: 1, B: 2, ..., Z: 26, Schlüssel: 1, Init.vector: 5

die einfache Caesar Mit '' hallo '' -> {8,5,12,12,20} -> {9,6,13,13,21} -> '' IFMMP ''

Aber wie soll ich mit CBC verschlüsseln?

Es wäre besonders hilfreich, wenn Sie mir zeigen könnten, wie Sie es in Java implementieren. Vielen Dank!

Antwort

1

Hmm ich interpretiere Ihre Frage, wie Sie denken, dass Sie durch den Schlüssel zu Ihrer Chiffre xor wollen, das ist falsch:

Sie xor von dem vorherigen Ergebnis aus der Chiffre. Etwas wie folgt aus:

// Untested code 
// The code below need to be adjusted for it to print meaningful 
// characters in the encrypted string as the xor function produces 
// integers outside the range of standard ascii characters 

private void cbcCaesar(){ 

    int key = 1; 
    String message = "java"; 
    int initialisationVector = 5; // the IV is not super necessarily hidden from an attacker but should be different for each message 

    StringBuilder encryptedMessageBuilder = new StringBuilder(); 

    char[] charArray = message.toCharArray(); 

    int encryptedLetter = initialisationVector; 
    for (int letter : charArray){ 
     int xorApplied = letter^encryptedLetter; 
     encryptedLetter = applyCaesarCipher(xorApplied, key); 
     encryptedMessageBuilder.append((char) encryptedLetter); 
    } 

    System.out.println(encryptedMessageBuilder.toString()); 
} 

private int applyCaesarCipher(int xorApplied, int key) { 
    return (xorApplied+ key) % 26; 
} 

Der einfachste Weg, das obige Snippet zu etwas Brauchbares würde zu konvertieren sein Schreiben an die Zahlen abzubilden 0-26 und Verwendung, die anstelle des ASCII-Kodierung des char

ich diese Ressource gefunden sehr gut sein https://www.youtube.com/watch?v=0D7OwYp6ZEc

+0

Verdammt danke. wusste nicht einmal, dass es in Java ein logisches XOR gab. Also ich lese um zu entschlüsseln, ich muss: encLetter^key^init, encLetter^key^encLetter, encLetter^key^encLetter, ...? Wenn dieser Gedanke wahr ist, denke ich, dass ich zumindest versuchen kann, den Rest selbst umzusetzen :) –