Eigene Variante der XOR-Verschlüsselung - sicher?



  • Hallo,

    angenommen, ich möchte Dateien mit XOR verschlüsseln. Die Datei wird in folgenden Schritten verschlüsselt:

    1.) Lese erstes Byte der Datei ein
    2.) Erzeuge XOR-Verknüpfung zum nächst gelegenen Byte in der Datei, das nächste Byte bildet also den Schlüssel für das erste Byte.
    3.) Wiederhole diesen Schritt für jedes Byte der Datei, bis Ende.

    Für wie sicher haltet ihr diese Methode? Ist es sicherer als ein einziger, statischer Key für alle Bytes? Mit welchen Methoden könnte die Datei dann wieder entschlüsselt werden, mit der Annahme, dass die Verschlüsselungsmethode nicht bekannt ist?



  • Für wie sicher haltet ihr diese Methode?
    Unsicherer als Twofish usw.
    Ist es sicherer als ein einziger, statischer Key für alle Bytes?
    Ich würde sagen JA
    Mit welchen Methoden könnte die Datei dann wieder entschlüsselt werden, mit der >Annahme, dass die Verschlüsselungsmethode nicht bekannt ist?
    Disassemblieren der Verschlüsselung Methode. Eine gute Methode zur verschlüsslung sollte auch funktioniern, wenn die Methode selbst bekannt ist.

    Ich denke auch das man es andersherum machen sollte, da das einlesen einer Datei von hinten nach vorne langsamer ist als andersherum und entschlüssel meistens schneller sein muss als das verschlüsseln(ok hängt sehr vom Anwendungsfall ab..)



  • Muss so etwas nicht in RudP, weil es ja nicht nur für c++ ist.



  • Kryptografie noob schrieb:

    Disassemblieren der Verschlüsselung Methode.

    Kommt nicht in Frage, da in meinem Beispiel nur die Datei vorliegt, nicht aber das Programm.

    Kryptografie noob schrieb:

    Unsicherer als Twofish usw.

    Könnte ich mir das von jemandem etwas detaillierter darlegen lassen?
    Merke auch gerade, eigentlich falsches Forum.



  • CodeOriginator schrieb:

    Für wie sicher haltet ihr diese Methode? Ist es sicherer als ein einziger, statischer Key für alle Bytes? Mit welchen Methoden könnte die Datei dann wieder entschlüsselt werden, mit der Annahme, dass die Verschlüsselungsmethode nicht bekannt ist?

    Sehr unsicher, da der Schlüssel gerademal 8bit sind. Wobei der ja sogar das letzte byte in der datei ist.
    Es ist nicht wirklich sicherer als ein statischer key. (also wenn der key jetzt nicht hinten in der datei stehen würde.) Sonst ist etwa sowas wie ein binäres ROT13 😉

    Jeder der sich etwas mit kryptographie befasst hat, wird dir sagen, dass ein algorithmus nur dann sicher ist, wenn er nicht geheim ist. Einzig und alleine der Schlüssel darf/muss geheim sein.

    Kryptoanalyse ist ein weites Feld, wenn man nur etwas Ahnung davon hat, reicht es noch lange nicht, um einen sicheren code zu entwickeln. Überlass das besser profis und nutze deren wissen!



  • lagalopex schrieb:

    Sehr unsicher, da der Schlüssel gerademal 8bit sind. Wobei der ja sogar das letzte byte in der datei ist.

    Warum ist das sehr unsicher? Die jeweiligen Schlüssel sind zwar nur 8 Bit breit, aber dafür enthält eine Datei so viele Schlüssel, wie diese in Bytes groß ist.
    Und warum ist der Key nur das letzte Byte der Datei? Ich denke, Du hast da einen kleinen Denkfehler reingebracht.



  • Mit diesem Schlüssel bekommst du alle "Schlüssel" auch heraus. Es reicht, das letzte Byte zu kennen um die gesamte Datei zu entschlüsseln. Wie definierst du dir denn Schlüssel, dass das für dich anders aussieht?



  • Das progrämmchen ist aus deinen spezifikationen entstanden...

    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    
    int main()
    {
    	unsigned char txt[] = "aaaabbbb";
    	int i, j;
    	// verschluesseln
    	for (i = 0; txt[i]; ++i)
    		txt[i] ^= txt[i + 1];
    
    	// in hex ausgeben (verschluesselt)
    	for (j = 0; j < i; ++j)
    		cout << hex << setfill('0') << setw(2) << (unsigned int) txt[j] << " ";
    	cout << endl;
    
    	// entschluesseln
    	for (j = i - 1; j >= 0; --j)
    		txt[j] ^= txt[j + 1];
    
    	// zeichenweise ausgeben
    	for (j = 0; j < i; ++j)
    		cout << txt[j] << "  ";
    	cout << endl;
    
    	// in hex ausgeben (entschluesselt)
    	for (j = 0; j < i; ++j)
    		cout << hex << setfill('0') << setw(2) << (unsigned int) txt[j] << " ";
    	cout << endl;
    
    	return 0;
    }
    

    wenns falsch ist, sag es 😉



  • Wenn du mal ein paar Varianten ausprobieren willst, dann verschlüssel einfach mal die Bilddaten in nem Bitmap (also ohne Header), wenn du dann immer noch so ungefähr erkennen kannst, was es darstellt, dann ist es nicht wirklich sicher.



  • CodeOriginator schrieb:

    lagalopex schrieb:

    Sehr unsicher, da der Schlüssel gerademal 8bit sind. Wobei der ja sogar das letzte byte in der datei ist.

    Warum ist das sehr unsicher? Die jeweiligen Schlüssel sind zwar nur 8 Bit breit, aber dafür enthält eine Datei so viele Schlüssel, wie diese in Bytes groß ist.
    Und warum ist der Key nur das letzte Byte der Datei? Ich denke, Du hast da einen kleinen Denkfehler reingebracht.

    würdest du darauf geld verwetten? kann ich in diesem fall bitte mal eine beispieldatei haben? 🙂



  • sothis_ schrieb:

    CodeOriginator schrieb:

    lagalopex schrieb:

    Sehr unsicher, da der Schlüssel gerademal 8bit sind. Wobei der ja sogar das letzte byte in der datei ist.

    Warum ist das sehr unsicher? Die jeweiligen Schlüssel sind zwar nur 8 Bit breit, aber dafür enthält eine Datei so viele Schlüssel, wie diese in Bytes groß ist.
    Und warum ist der Key nur das letzte Byte der Datei? Ich denke, Du hast da einen kleinen Denkfehler reingebracht.

    würdest du darauf geld verwetten? kann ich in diesem fall bitte mal eine beispieldatei haben? 🙂

    hehe, hab jetzt iwie das "SCNR" vermisst 😉
    Aber schon fies... ist ja nur unkenntlich gemacht. ansich ist das ja nichtmal ne verschlüsselung ^



  • Aber man kann ja das letzte Byte auch noch mal mit xor mit einen key verschlüsseln. Man sollte auch das ganze auf 64 oder noch besser mehr bit grosse Blöcke umbauen.



  • lagalopex schrieb:

    hehe, hab jetzt iwie das "SCNR" vermisst 😉

    eigentlich war das ernst gemeint 😛



  • filmor schrieb:

    Mit diesem Schlüssel bekommst du alle "Schlüssel" auch heraus.

    Ja, das stimmt... nur woher soll ein fremder wissen, dass jedes Byte einen Schlüssel darstellt?

    Wenn du mal ein paar Varianten ausprobieren willst, dann verschlüssel einfach mal die Bilddaten in nem Bitmap (also ohne Header), wenn du dann immer noch so ungefähr erkennen kannst, was es darstellt, dann ist es nicht wirklich sicher.

    Eine wirklich gute Idee. Werde ich probieren.

    würdest du darauf geld verwetten? kann ich in diesem fall bitte mal eine beispieldatei haben? 🙂

    Ich würde darauf keinen einzigen Cent verwetten, da es sich nicht um eine Verschlüsselung für dein praktischen Einsatz handelt, sondern reine Interesse daran. Aber das mit der Beispieldatei lasse ich mir natürlich nicht zweimal sagen:

    hex:

    2D 0C 16 16 0B 4E 73 32 15 0E 5A 57 1E 05
    

    ASCII:

    -Ns2ZW
    

    Viel Spaß beim Entschlüsseln. (Mit lagalopex' Code verschlüsselt) 🙂



  • CodeOriginator schrieb:

    Aber das mit der Beispieldatei lasse ich mir natürlich nicht zweimal sagen:

    hex:

    2D 0C 16 16 0B 4E 73 32 15 0E 5A 57 1E 05
    

    ASCII:

    -Ns2ZW
    

    Viel Spaß beim Entschlüsseln. (Mit lagalopex' Code verschlüsselt) 🙂

    Also würde dir 05 bleiben, und 05 xor 1e ist 1b... usw usf
    28 05 09 1f 09 02 4c 3f 0d 18 16 4c 1b 05

    Und wie gesagt, unkenntlich ja, verschlüsselt nein (dazu fehlt der geheime schlüssel).

    Algo muss bekannt sein, alles andere ist sinnfrei, akzeptier es.

    http://de.wikipedia.org/wiki/Kryptographie schrieb:

    So formulierte Auguste Kerckhoffs von Nieuwenhof mit Kerckhoffs’ Prinzip einen Grundsatz der Kryptographie, nachdem die Sicherheit eines kryptographischen Verfahrens allein auf der Geheimhaltung des Schlüssels basieren soll – das Verfahren selbst muss also nicht geheim gehalten werden; im Gegenteil: es kann veröffentlicht und von vielen Experten untersucht werden.



  • char txt[] = {0x2D, 0x0C, 0x16, 0x16, 0x0B, 0x4E, 0x73, 0x32, 0x15, 0x0E, 0x5A, 0x57, 0x1E, 0x05, 0x0 };
    
    	for(int c = 1; c<256;c++){
    		int len = 14;
    		char txt2[15];
    		memcpy(txt2,txt,len+1);
    		txt2[len-1]=c;
    		bool o=true;
    		for (int j = len-1; j >= 0; --j) {
    			txt2[j] ^= txt2[j + 1]; 
    			if(txt2[j]<20 || txt2[j]>180) o=false;
    		}
    		if(o)std::cout<<txt2;
    		std::cout<<"\n";
    	}
    

    "Diesen Satz wi"

    und den Rest hast du nicht gepostet



  • Algo muss bekannt sein, alles andere ist sinnfrei, akzeptier es.

    Ich akzeptiere es doch, was stellst Du Dich so an? Ich wollte lediglich Meinungen und Erklärungen haben. 🙂

    hingeschmiert schrieb:

    "Diesen Satz wi"

    Deine "Entschlüsselung" erfolgte letztendlich auf visueller Basis, indem du dir die entschlüsselten Fragmente angeguckt, und diese als entschlüsselt deklariert hast. Aber wie würde die Entschlüsselung auf maschineller Basis aussehen, sodass also der Computer feststellt, ob der Text entschlüsselt ist?

    Nochmal zur Klarstellung, ich verteidige hier keinesfalls die Idee mit der XOR-Verschlüsselung, und mir ist durchaus bewusst, dass es sich lediglich um eine "Unkenntlichmachung" handelt. Ich möchte lediglich in Erfahrung bringen, ob und wie die mit diesem Verfahren verschlüsselten Daten entschlüsselt werden können.



  • Indem man den Algorithmus kennt 😉

    Zur Not macht man's wie oben irgendwo erwähnt, man reverse-engineert (gibt's dazu ein deutsches Wort? Rückentwickelt?) deinen Dekoder.
    Klar, simple Knackmethoden funktionieren nicht (also auf Buchstabenhäufigkeit oder Struktur schauen (zumindest nach meinem Wissensstand, der hierfür aber doch sehr begrenzt ist)).

    Was du da machst ist eher ein Prüfsummenverfahren.



  • CodeOriginator schrieb:

    hingeschmiert schrieb:

    "Diesen Satz wi"

    Deine "Entschlüsselung" erfolgte letztendlich auf visueller Basis, indem du dir die entschlüsselten Fragmente angeguckt, und diese als entschlüsselt deklariert hast. Aber wie würde die Entschlüsselung auf maschineller Basis aussehen, sodass also der Computer feststellt, ob der Text entschlüsselt ist?

    Nochmal zur Klarstellung, ich verteidige hier keinesfalls die Idee mit der XOR-Verschlüsselung, und mir ist durchaus bewusst, dass es sich lediglich um eine "Unkenntlichmachung" handelt. Ich möchte lediglich in Erfahrung bringen, ob und wie die mit diesem Verfahren verschlüsselten Daten entschlüsselt werden können.

    XOR Verschlüsselung ist gut und eine richtige Verschlüsselung, wenn man einen langen Schlüssel nimmt, nur bei einer Methode gibt es nur 256 Möglichkeiten und die kann man sich schnell mal anschauen.
    Wikipedia: Kryptoanalyse



  • CodeOriginator schrieb:

    Deine "Entschlüsselung" erfolgte letztendlich auf visueller Basis, indem du dir die entschlüsselten Fragmente angeguckt, und diese als entschlüsselt deklariert hast. Aber wie würde die Entschlüsselung auf maschineller Basis aussehen, sodass also der Computer feststellt, ob der Text entschlüsselt ist?

    wie der vorposter schon erwähnt hat, ist der erste schritt den algorithmus, wenn er nicht bekannt ist, herauszufinden. dies funktioniert am einfachsten wenn man einen gültigen schlüssel, einen damit verschlüsselten ciphertext und den dazugehörigen plaintext besitzt, welches immer der fall ist wenn die verschlüsselung öffentlich gemacht wird (die software also vertrieben wird). dann benötigt man mit einem disassembler in der regel nicht lange den algortihmus zu rekonstruieren. das wohl bekannteste beispiel ist der CSS algorithmus mit dem video-dvd daten verschlüsselt werden. dieser algorithmus wurde auch geheim gehalten, hat aber auch nichts genützt ;). nichtzdestotrotz, an dieser stelle angelangt, geht es dann los die schwächen des algorithmus zu analysieren oder ggf mit brute-force (wie im obigen beispiel) den eigentlichen angriff zu starten 🙂


Anmelden zum Antworten