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.


  • Mod

    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.


Anmelden zum Antworten