Mehrfache XOR Verschlüsselung

AndiixAndii

Mitglied
Hi!

Ich wollte mal fragen, wie sicher eine mehrfache XOR-Verschlüsselung ist.
Die einfache XOR-Verschlüsselung soll ja nicht sehr sicher sein.
Aber wenn man den Text mehrmals mit verschiedenen Schlüsseln verschlüsselt, wie sieht es dann aus?

Hier mal mein Sourcecode:
Java:
    public static String crypt(String text, char key) {
        StringBuilder s = new StringBuilder(text);
        for(int i = 0; i < s.length(); i++) {
            s.setCharAt(i, (char)(s.charAt(i) ^ key));
        }
        return s.toString();
    }
    
    public static String crypt(String text, String key) {
        if(key.length() == 1) return crypt(text, key.charAt(0));
        StringBuilder s = new StringBuilder(text);
        for(int i = 0, j = 0; i < s.length(); i++, j++) {
            s.setCharAt(i, (char)(s.charAt(i) ^ key.charAt(j)));
            if(j == key.length() - 1) j = 0;
        }
        return s.toString();
    }
    
    public static String encrypt(String text, String[] key) {
        for(int i = 0; i < key.length; i++) {
            text = crypt(text, key[i]);
        }
        return text;
    }
    
    public static String decrypt(String text, String[] key) {
        List<String> rkey = Arrays.asList(key);
        Collections.reverse(rkey);
        return encrypt(text, rkey.toArray(new String[0]));
    }

Also die erste crypt Methode verschlüsselt den Text XOR mit einem einzigen Zeichen.
Die überladene crypt Methode verschlüsselt den Text XOR mit einem String, wenn der am Ende ist, fangt der Algorithmus damit wieder von vorne an.
Die encrypt Methode verschlüsselt den Text nacheinander mit verschiedenen String aus einem Array.
Die decrypt Methode entschlüsselt den Text mit encrypt mit dem umgedrehten Schlüsselarray.
Durch das mehrfache Verschlüsseln kann man mit Klartext XOR verschlüsselter Text nicht mehr den Key herausfinden.

Wie sicher ist dieser Mehrfach-XOR-Algorithmus?

LG!
 
Bei Verschlüsselung mittels XOR sollte der Schlüssel immer länger als der zu verschlüsselnde Text sein.
Außerdem sollte er ausreichend "konfus" sein, also z.B. nicht mehrere 0-Bytes am Stück enthalten.
Wenn diese beiden Punkte gegeben sind, ist ein mehrfaches Verschlüsseln genauso sicher (oder unsicher) wie ein einmaliges - bringt also nichts.
 
der Schlüssel soll eine Zufallsfolge sein, die einer Gleichverteilung (weißes Rauschen) entspricht und länger ist als der zu verschl. Text. Da keine Muster erkennbar sein werden, hilft nur ein Ausprobieren aller Möglichkeiten. Bei einem Text von einigen Tausend Zeichen, wünsche ich ein langes Leben! Es ist mit einemPC heutiger Bauart einfach nicht möglich, behaupte ich!
 
der Schlüssel soll eine Zufallsfolge sein, die einer Gleichverteilung (weißes Rauschen) entspricht und länger ist als der zu verschl. Text. Da keine Muster erkennbar sein werden, hilft nur ein Ausprobieren aller Möglichkeiten. Bei einem Text von einigen Tausend Zeichen, wünsche ich ein langes Leben! Es ist mit einemPC heutiger Bauart einfach nicht möglich, behaupte ich!
Zum einen ist der Thread schon > 7 Jahre alt ...

Und zu den gewünschten Mustern kommt es, wenn Du den Schlüssel mehrfach verwendest. Sprich: Du verschlüsselst Nachrichten von Dir an einen Dritte und diese nachrichten werden abgefangen. Dann hat man das Muster und das sogar sehr deutlich, da ja Ende der einen Nachricht und Anfang der nächsten Nachricht gut erkennbar ist.
 
Zum einen ist der Thread schon > 7 Jahre alt ...

Und zu den gewünschten Mustern kommt es, wenn Du den Schlüssel mehrfach verwendest. Sprich: Du verschlüsselst Nachrichten von Dir an einen Dritte und diese nachrichten werden abgefangen. Dann hat man das Muster und das sogar sehr deutlich, da ja Ende der einen Nachricht und Anfang der nächsten Nachricht gut erkennbar ist.
nur einmal verwenden: ich habe einen sehr langen (1MB z.B.) generiert und nutze den ersten Teil nicht mehr, muss also dem Empfänger auf sicherem Weg die 1MB gegeben haben und nur den Offset mitteilen!
 
nur einmal verwenden: ich habe einen sehr langen (1MB z.B.) generiert und nutze den ersten Teil nicht mehr, muss also dem Empfänger auf sicherem Weg die 1MB gegeben haben und nur den Offset mitteilen!
Dir ist die Verschlüsselungsmethode selbst zu unsicher und versuchst daher durch zusätzliche Maßnahmen die Verschlüsselung zu stärken?

Wenn der Offset als erstes mitgegeben wird, dann ist es Security by Obscurity. Ansonsten hast Du unnötig hohe Aufwände um z.B. den Offset sicher zu übertragen.

Dieses "sicher" und "unsicher" ist immer relativ zu sehen. Und daher muss sich diese Verschlüsselung mit anderen Verschlüsselungen messen und da liegen dann halt doch Welten dazwischen 🙂
 
Kurze Zwischenfrage ohne den ganzen Thread gelesen zu haben: Wieso keine asymmetrische Verschluesselung?

Wenn man ohnehin einen "Empfaenger" hat welcher den Schluessel kennen muss, dann waere es doch viel besser wenn man gleich ein etabliertes asymmetrisches Format verwendet, wie zum Beispiel RSA. Hat zusaetzlich den Vorteil dass niemand den Absender nachahmen kann, die Schluessel kann man rotieren, und wenn jemals jemand RSA bricht, dann schalten wir ohnehin das Internet ab fuer ein paar Jahre, also ist dann auch nicht relevant.
 
ohne den ganzen Thread gelesen zu haben

Es wurde im Thread eigentlich nur betrachtet, ob eine mehrfache xor Verschlüsselung die Sicherheit erhöhen würde und das ist ja nicht der Fall. Nur eben wurde die - ursprünglich als unsicher bezeichnete - xor Verschlüsselung als sicher bezeichnet (Das war mein Verständnis der neuen Aussage) und das ist ja de Facto nicht der Fall.

Konkrete Alternativen wurden aber nicht benannt, denn das war (zumindest noch) nicht Thema 🙂
 
so als neben anmerkung

eine sicherheits system ist nicht sicher nur weil der andere nicht weis wie es funktioniert

da gabs mal ein zitat das ich nicht merh ganz genau weis was im prinzip ausgesagt hat
"ein sicherheits system muss durch die art wie es funktioniert sicher sein und nicht dadurch dass niemand weis wie es funktioniert"

zb die ssh verbindung auf linux , da weis jeder wie es funktioniert weil jeder den code sehen kann aber durch die art und wesie wie das ding funktioneirt das macht es sicher
 
Wenn man den Thread gerade eh neu belebt hat, dann ist die Anfangsfrage auch einfach zu beantworten mit einer mehr mathematischen Sicht auf das Problem:

Ich habe Daten D und die Keys K1 und K2.

Dann kann ich jetzt verschlüsseln:
D xor K1 xor K2

Ich könnte jetzt einen Key K' erstellen aus K1 und K2:
K' := K1 xor K2

Da gilt: (D xor K1) xor K2 = D xor (K1 xor K2)
kann man nun also einfach schreiben: D xor K'

Das wäre sowas wie eine mathematische Herleitung. Wenn ich also eine Kommunikation entschlüsseln will, dessen Key(s) ich nicht kenne, dann müsste ich nicht die Schlüssel K1, K2, ...Kn knacken müssen sondern man knackt weiterhin nur einen Key, für den dann gelten würde: K' = K1 xor K2 xor .... xor Kn

Aber die eigentliche Themenstellung ist ja schon lange nicht mehr aktuell ... aber es ging mir halt auch eben so durch den Kopf.
 
da gabs mal ein zitat das ich nicht merh ganz genau weis was im prinzip ausgesagt hat
"ein sicherheits system muss durch die art wie es funktioniert sicher sein und nicht dadurch dass niemand weis wie es funktioniert"
Hallo, Du meinst wohl Kerkhoffs Prinzip. Hier wird davon gesprochen, dass die Sicherheit nur von der Kenntnis des Schlüssels abhängt, nicht von der Kenntnis der Verschlüsselung.

Was XOR angeht, ist dies grundsätzlich der Fall. Jedes Bit das man findet kann war mit 50 %iger Wahrscheinlichkeit vorher eine 0 (oder 1 🙂). XOR ist somit erstmal sicher. Die Aussagen, dass ein guter Schlüssel nicht mehrere 0en am Stück enthalten sollte ist für mich nicht nachvollziehbar. Echte Zufallszahlen sind zufällig, dass heißt es kann auch eine Sequenz geben, bei der 100 0en hintereinander im Schlüssel stehen. Solange der Schlüssel nur Sender und Empfänger bekannt ist, stellt dies keine Schwachstelle dar.
 
Kurze Zwischenfrage ohne den ganzen Thread gelesen zu haben: Wieso keine asymmetrische Verschluesselung?

Wenn man ohnehin einen "Empfaenger" hat welcher den Schluessel kennen muss, dann waere es doch viel besser wenn man gleich ein etabliertes asymmetrisches Format verwendet, wie zum Beispiel RSA. Hat zusaetzlich den Vorteil dass niemand den Absender nachahmen kann, die Schluessel kann man rotieren, und wenn jemals jemand RSA bricht, dann schalten wir ohnehin das Internet ab fuer ein paar Jahre, also ist dann auch nicht relevant.
Da gäbe es wahrscheinlich viele Gründe:

  1. Weil der Threat-Eröffner sich für XOR interessiert 🙂
  2. Symmetrische Verfahren benötigen (nach meiner Kenntnis) deutlich kleinere Schlüssel und weniger Rechenleistung (letzteres ist relevant, ein KByte Speicher würde sich schon finden lassen)
  3. Moderne Verfahren nutzen teilweise hybride (via asymmetrischem Verfahren wird ein symmetrischer Schlüssel ver-/ entschlüsselt). Das ermöglicht z.B. mehrere verschiedene (authentische) Zugriffe auf das gleiche Chiffrat (z.B. eine verschlüsselte Festplatte oder ein Schlüsselsafe) und wird (imho) auch für die Kommunikation mit Webservern genutzt.
  4. Asymmetrische Verfahren hängen genauso von der Kenntnis des Schlüssels ab. Ein Man-In-The-Middle kann auch übermittelte öffentliche Schlüssel austauschen. Deshalb gibt es PKI, bei denen man sich vortrefflich streiten kann ob zentrale Stellen vertrauenswürdig sind (Security approved by NSA oder auch die Qualitätssicherung türkischer Google-Suchen durch den Staat, denke zu beidem gab es mal Artikel in bekannten Nachrichten). Das gleiche bei self-sovereign Identity, auch hier müssen wir überlegen wo der "Vertrauensanker" herkommt. Sicher sind wir nur, wenn der Schlüssel authentisch zwischen Sender und Empfänger ausgetauscht wurde - bei symmetrischen Verfahren gilt noch, dass der Schlüssel sonst keinem bekannt sein darf. Für alle Algorithmen gilt natürlich auch, dass das Verfahren noch wirksam sein muss und sich nicht (in akzeptabler) Zeit die Verschlüsselung knacken lässt. Das Wichtigste: Sicherheit ist ein äußerst flüchtiger Zustand, frei von nicht vertretbaren Risiken (aber ein bisschen Restrisiko müssen wir immer vertreten).
 

Zurück
Oben