String mittels XOR verschlüsseln
-
Hallo zusammen,
habe mich gerade an einer kleinen Funktion probiert, welche mir einen String mittels XOR verschlüsselt.
Leider sieht das Ergebnis immer etwas komisch (2-3 Zeichen nur) und ich bin mir nicht ganz sicher wo der Fehler liegt.
Könnte jemand mal über den folgenden Code schauen und mir sagen wo der Fehler liegt:#include <stdio.h> #include <stdlib.h> #include <windows.h> const char sKey[] = "geheim"; void XOREncryptString(char *text, const char *key,char *sOutput) { int key_count = 0; //Used to restart key if strlen(key) < strlen(encrypt) int encrypt_byte; int i; for(i=0; i<strlen(text); i++) //Loop through each byte of file until EOF { //XOR the data and write it to a file sOutput[i] = text[i] ^ key[key_count]; //Increment key_count and start over if necessary key_count++; if(key_count == strlen(key)) key_count = 0; printf("i: %d\n",i); } sOutput[i+1] = '\0'; } int main() { char EncryptString[] = "Das ist ein einfacher 0815 Test"; char output[512]; memset(output,0,sizeof(output)); XOREncryptString(EncryptString,sKey,output); printf("%s\n",output); }
Vielen Dank!
-
Du darfst nicht davon ausgehen, dass bei dieser Verschlüsselung wieder ein druckbarer Text herauskommt. Insbesondere erzeugt das i an Position 4 im Schlüssel zusammen mit dem i an Position 4 des Texts ein Nullbyte, das von printf als Stringende interpretiert wird.
-
MFK schrieb:
... des Texts ein Nullbyte, das von printf als Stringende interpretiert wird.
Das wird schon vom strlen(text) der
for(i
-Schleife als Ende erkannt.
-
Und in Zeile 25 (sOutput[i+1] = '\0';) ist das +1 zuviel.
Nach der Schleife steht i schon auf der '\0'
-
DirkB schrieb:
MFK schrieb:
... des Texts ein Nullbyte, das von printf als Stringende interpretiert wird.
Das wird schon vom strlen(text) der
for(i
-Schleife als Ende erkannt.Wieso ? Der Inhalt der Variable "test" wird doch nicht verändert oder verstehe ich da was falsch ?
MFK schrieb:
Du darfst nicht davon ausgehen, dass bei dieser Verschlüsselung wieder ein druckbarer Text herauskommt. Insbesondere erzeugt das i an Position 4 im Schlüssel zusammen mit dem i an Position 4 des Texts ein Nullbyte, das von printf als Stringende interpretiert wird.
d.h. am besten kodiere ich den String nochmal mittels Base64 und dann müsste es passen ?
Vom Code her passt das soweit ?
-
Sorry, du hast recht.
Du kannst auch das ganze auch als Bytefolge ansehen.
Dann funktionieren aber die Stringfunktionen nicht mehr.
Du musst die Länge dann extra in einer Variablen speichern.
-
ISt verschlüßeln mit XOR eigentlich "relevant" oder nur eine spielerei?
Sprich, "wirkliche Codierprogramme...." da bewegen wir uns eher mit Hashtables und so Zeug oder?
-
unsure123 schrieb:
ISt verschlüßeln mit XOR eigentlich "relevant" oder nur eine spielerei?
Spielerei.
unsure123 schrieb:
Sprich, "wirkliche Codierprogramme...." da bewegen wir uns eher mit Hashtables und so Zeug oder?
Hashing ist keine Verschlüsselung.
-
Wenn man mit einem One Time Pad (http://de.wikipedia.org/wiki/One-Time-Pad) XORt, dann ist das sicher und kann auch so verwendet werden.
-
patrick246 schrieb:
Wenn man mit einem One Time Pad (http://de.wikipedia.org/wiki/One-Time-Pad) XORt, dann ist das sicher und kann auch so verwendet werden.
Spielerei/Snake oil. Du ersetzt das Problem, wie man ein kleines Geheimnis sicher überträgt um später große Geheimbotschaften über unsichere Kanäle übertragen zu können*, damit, dass du ein großes Geheimnis sicher übertragen musst.
*: Und wenn man nur Botschaften sicher empfangen möchte, dann ist noch nicht einmal der sichere Austausch eines kleinen Geheimnisses nötig.