Xor Verschlüsselung



  • Hallo zusammen,

    ich habe ein Programm, in diesem Programm wollte ich ein Password "hart" hinterlegen. Dachte mir jetzt aber um das Password nicht im Plaintext im Code zu hinterlegen, schreibe ich eine XOR Verschlüsselung:

    int XORString(char *input_text,char *output_text, char *key) {
    	int key_count = 0; //Schlüssel muss immer die Länge vom input_text haben
    	int count,len_text,len_key;
    
    	len_text = strlen(input_text);
    	len_key = strlen(key);
    
    	for(count=0; count<len_text; count++) {
    
    		output_text[count] = input_text[count] ^ key[key_count]; 
    
    		key_count++;
    
    		if(key_count == len_key)
    			key_count = 0;
    	}
    
    	output_text[count] = '\0';
    
    	return count;
    }
    

    Problem:
    Ich generiere mit der oben geposteten Funktion ein "verschlüsseltes" Kennwort und füge es in dann in mein Password char Array ein.
    Nur leider kommt beim selben Aufruf der Funktion nicht der richtige Text raus.
    Kann mir bitte jemand auf die Sprünge helfen wo mein Fehler im Code ist ?

    Vielen Dank !



  • Um es nochmal ein bisschen genauer zu beschreiben.
    Ich nutze die Funktion um ein Password zu "verschlüsseln".
    Diesen String lasse ich mir per printf ausgeben und füge das ganze in meinem "Password" Programm zusammen bzw. hinterlege den String der mir per printf ausgegeben wurde in einem char Array.

    Nur leider lässt sich das verschlüsselte Password nicht "entschlüsseln".


  • Mod

    Grave schrieb:

    Nur leider lässt sich das verschlüsselte Password nicht "entschlüsseln".

    Da du keinen vollständigen Code zeigst, solltest du zumindest ein paar Beispiele liefern.

    Was mir auffällt ist, dass dein xor-cyphertext ggf. eingebette '\0' enthalten kann (als kein echter C-String ist), der erneute Aufruf dieser Funktion zur Entschlüsselung würde dann mit falschen Stringlängen arbeiten.


  • Mod

    Selbst nachdem du das zum Laufen gebracht hast: Wirklich etwas nützliches über Passwörter lernen wirst du erst, wenn du dir mal überlegst (oder fragst), wie das wohl richtig geht. Denn deine jetzige Idee erhöht die Sicherheit nur von "Oma Trude" zu "Oma Trudes fünfjähriger Enkel". Beschreib mal, wieso du es für sinnvoll hältst, ein Passwort in einem Programm zu speichern.

    Selbst wenn Oma Trude es nicht schafft, das Klartextpasswort aus dem Prozess einfach auszulesen (das schafft nur ihr Enkel): Man kann Programme (und damit die Berechtigung, für die das Passwort das Programm ausweist) beliebig kopieren, was das Prinzip eines Passworts ad absurdum führt.

    Oder ist es umgekehrt und jemand soll sich gegenüber deinem Programm authentifizieren, indem er das richtige Passwort eingibt? Selbst wenn Oma Trude es nicht schafft, die Passwortprüfung im Prozess einfach durch einen Jump zu ersetzen (das schafft nur ihr Enkel): Niemals Passwörter speichern! Egal wie verschlüsselt! Stattdessen Hashes¹ speichern. Damit klappt ein Vergleich genauso sicher, aber man kann von dem Hash nicht auf das Passwort schließen. Perfekte Lösung.

    ¹: Natürlich ein kryptografischer Hash mit reichlich Salz und vielen Runden. Am besten eine fertige Kryptobibliothek nehmen. Aber das sind technische Details, wichtig ist zu verstehen, warum der Hash sicher ist und die andere Methode nicht.



  • SeppJ schrieb:

    Selbst nachdem du das zum Laufen gebracht hast: Wirklich etwas nützliches über Passwörter lernen wirst du erst, wenn du dir mal überlegst (oder fragst), wie das wohl richtig geht. Denn deine jetzige Idee erhöht die Sicherheit nur von "Oma Trude" zu "Oma Trudes fünfjähriger Enkel". Beschreib mal, wieso du es für sinnvoll hältst, ein Passwort in einem Programm zu speichern.

    Selbst wenn Oma Trude es nicht schafft, das Klartextpasswort aus dem Prozess einfach auszulesen (das schafft nur ihr Enkel): Man kann Programme (und damit die Berechtigung, für die das Passwort das Programm ausweist) beliebig kopieren, was das Prinzip eines Passworts ad absurdum führt.

    Oder ist es umgekehrt und jemand soll sich gegenüber deinem Programm authentifizieren, indem er das richtige Passwort eingibt? Selbst wenn Oma Trude es nicht schafft, die Passwortprüfung im Prozess einfach durch einen Jump zu ersetzen (das schafft nur ihr Enkel): Niemals Passwörter speichern! Egal wie verschlüsselt! Stattdessen Hashes¹ speichern. Damit klappt ein Vergleich genauso sicher, aber man kann von dem Hash nicht auf das Passwort schließen. Perfekte Lösung.

    ¹: Natürlich ein kryptografischer Hash mit reichlich Salz und vielen Runden. Am besten eine fertige Kryptobibliothek nehmen. Aber das sind technische Details, wichtig ist zu verstehen, warum der Hash sicher ist und die andere Methode nicht.

    Ich verstehe was du mir damit sagen möchstest, dennoch bin ich gerade noch am lernen und bin der Meinung ich sollte wenigstens mit einer XOR Verschlüsselung erstmal klar kommen bevor ich mich an das nächste Thema wage.

    camper schrieb:

    Grave schrieb:

    Nur leider lässt sich das verschlüsselte Password nicht "entschlüsseln".

    Da du keinen vollständigen Code zeigst, solltest du zumindest ein paar Beispiele liefern.

    Was mir auffällt ist, dass dein xor-cyphertext ggf. eingebette '\0' enthalten kann (als kein echter C-String ist), der erneute Aufruf dieser Funktion zur Entschlüsselung würde dann mit falschen Stringlängen arbeiten.

    Das Verschlüsselte Password erstelle ich wie folgt:

    int XORString(char *input_text,char *output_text, char *key) {
        int key_count = 0; //Schlüssel muss immer die Länge vom input_text haben
        int count,len_text,len_key;
    
        len_text = strlen(input_text);
        len_key = strlen(key);
    
        for(count=0; count<len_text; count++) {
    
            output_text[count] = input_text[count] ^ key[key_count];
    
            key_count++;
    
            if(key_count == len_key)
                key_count = 0;
        }
    
        output_text[count] = '\0';
    
        return count;
    }
    
    char out[256];
    memset(out, 0, sizeof(out));
    
    					XORString("DasistMeinGeheimesPassword", out, "Test");
    					printf("String verschluesselt: %s\n",out);
    

    Der Wert welcher mir mittels printf() ausgegeben wird: 
    Nun nehme ich diesen Wert in ein anderes Programm und versuche ihn zu entschlüsseln:

    char decrypted[256];
    memset(out, 0, sizeof(out));
    
    XORString("", decrypted, "Test");
    printf("String entschlüsselt: %s\n",decrypted);
    

    Leider bekomme ich nicht den Text "DasistMeinGeheimesPassword" angezeigt!
    Ironischerweise ist es mir nicht möglich den genauen "verschlüsselten" String hier anzugeben, da ich nur komische Zeichen angezeigt bekomme. Wenn ich mir diesen Beitrag in der Vorschau angucke ist alles leer.
    Was mir mittlerweile schon eingefallen ist, ich sollte die XOR Funktion ein wenig verbessern:

    int XORString(char *input_text, int len_text,char *output_text, char *key) {
        int key_count = 0; //Schlüssel muss immer die Länge vom input_text haben
        int count,len_key;
    
        len_key = strlen(key);
    
        for(count=0; count<len_text; count++) {
    
            output_text[count] = input_text[count] ^ key[key_count];
    
            key_count++;
    
            if(key_count == len_key)
                key_count = 0;
        }
    
        output_text[count] = '\0';
    
        return count;
    }
    

    Aber das hilft mir nicht bei meinem eigentlichen Problem.
    Muss ich den Wert der mir zurückgegeben wird, erst in Hex umwandeln um den von A nach B zu transportieren bzw. sauber angezeigt zu bekommen =



  • du weißt dass du, wenn du

    Grave schrieb:

    char decrypted[256];
    memset(out, 0, sizeof(out));
    
    XORString("", decrypted, "Test");
    printf("String entschlüsselt: %s\n",decrypted);
    

    aufrufst, ein string der länge 0 entschlüsselt wird?



  • Hi, was passiert denn, wenn du direkt "out" an die zu Funktion zum entschlüssel übergibst? Wenn du Bitfolgen durch die Verschlüsselung bekommst, die nicht richtig darstellbar sind, kann das mit Copy&Paste von Text schief gehen.

    char out[256];
    memset(out, 0, sizeof(out));
    
    XORString("DasistMeinGeheimesPassword", out, "Test");
    
    printf("String verschluesselt: %s\n",out);
    
    char decrypted[256];
    memset(decrypted, 0, sizeof(decrypted));
    
    XORString(out, decrypted, "Test");
    printf("String entschlüsselt: %s\n",decrypted);
    

    Edit 1: Typing
    Edit 2: Ich möchte nochmal auf Campers Anmerkung hinweisen!



  • camper schrieb:

    Was mir auffällt ist, dass dein xor-cyphertext ggf. eingebette '\0' enthalten kann (als kein echter C-String ist),

    Das passiert, wenn das Zeichen im Wort und Schlüssel identisch ist.

    DasistMeinGeheimesPassword
    TestTestTestTestTestTestTe
      ^ da       ^
    

    Du kannst das verschlüsselte Wort nicht mehr als C-String behandeln.
    Alle Standardfunktionen für Strings (z.B. strlen und printf ) kannst du nicht mehr benutzen.

    Aber probier mal "@XYZ" als Schlüssel.



  • @camper vielen Dank du hast mich auf den richtigen Weg gebracht.
    Habe mir zwei Funktionen geschrieben,HexToString und StringToHex mit diesen Funktionen ist es mir möglich mit einer Reihenfolge von Bytes zu arbeiten die sich nicht richtig darstellen lassen.


Log in to reply