XOR Verschlüsselung



  • hallo,
    ich muss mal wieder ein proggi schreiben und zwar folgendes:

    Problem:
    Ein einfacher, aber dennoch wirkungsvoller Verschl¨usselungsalgorithmus l¨auft folgender-
    maßen ab:
    1. Vom Benutzer wird ein Passwort (= Key) eingelesen.
    2. Anschließend wird der zu verschl¨usselnde Text (= Plaintext) eingelesen.
    3. Nun werden Plaintext und Key zeichenweise zum sog. Ciphertext mit dem bitweisen
    Operator XOR verkn¨upft. Ist der Key k¨urzer als der Plaintext, wird der Key so oft
    wie n¨otig wiederholt.
    Zum Entschl¨usseln l¨auft der Algorithmus genauso ab, statt des Plaintextes werden nun
    Ciphertext und Key mit XOR verkn¨upft.
    Aufgabe:
    Schreiben Sie ein Programm gem¨aß o.g. Algorithmus.

    Ich hab mal was geschrieben:

    #include <stdio.h>

    void toNull (char *zeiger, int Limit);

    void main()
    {

    char szPlaintext[999], szCiphertext[999],c;
    int szKey[999];
    int i=0, j=0;

    toNull (szPlaintext, 999);
    toNull (szKey, 999);
    toNull (szCiphertext, 999);

    printf("Bitte geben sie den zu verschluesselnden Text ein!\n");
    gets(szPlaintext);
    printf("Bitte geben sie den Key ein\n");
    gets(szKey);

    c=*szPlaintext;

    while(c){
    szCiphertext = c^szKey[j];
    szCiphertext += 65;
    i++; j++;
    if(szKey[j] == 0)
    j=0;
    c=szPlaintext;
    }

    for(j=0;j<i;j++)
    printf("%c", szCiphertext[j]);

    return 0;
    }

    void toNull (char *zeiger, int Limit)
    {int i;
    for(i=0;i<Limit;i++)
    *(zeiger+i)=0;}

    funktioniert aber nur soweit, dass das ergebnis des vergleichs in "szCiphertext" steht, aber leider als ASCII-werte.
    ich habe mal ein BSP:
    ich habe als Text: h
    als Key: a

    h : 01101000
    a : 01100001
    ------------- XOR
    00001001 (:= Ascii 9)

    in szCiphertext steht dann auche eine 9. aber halt als ASCII Wert.
    wie kann ichs machen das ich einen Text eingeben kann der auf dies Art dann verschlüsselt wird???
    vielen dank für euere Hilfe.

    mfg rookie



  • Benutze mal bitte die Code Tags C/C++!
    Also erstmal benutzt du gets für ein int Array. Das mag vlielleicht funktionieren ist aber nicht richtig so wie es da steht.
    Deine ganzen Wertezuweisungen auf szCiphertext sehen für mich falsch aus.
    Und wenn an einer Stelle in szCiphertext eine 9 steht, so wie du sie auch erwartest, dann ist es doch ok. ASCII ist heißt doch in dem Fall nur wie du die 9 interpretierst oder ausgibst.



  • hi. danke für die Antwort. Habs wieder geändert:

    #include <stdio.h>
    
    void toNull (char *zeiger, int Limit);
    void readKey (char *key);
    void readText (char *text);
    
    void main()
    {
    
    	char c;
    	char szKey[999], szPlaintext[999], szCiphertext[999]; 
    	int i=0, j=0; 
    
    	//Arrays initialisiseren
    	toNull (szPlaintext, 999);
    	toNull (szKey, 999);
    	toNull (szCiphertext, 999);
    
    	//Einlesen
    
    	readText (szPlaintext);
    	readKey (szKey);
    
    	//Verschlüsselung
    	c=*szPlaintext;
    	while(c){
    		szCiphertext[i] = c^szKey[j];
    		i++; j++;
    		if(szKey[j] == 0)
    			j=0;
    		c=szPlaintext[i];
    	}
    
    	//Ausgabe
    	for(j=0;j<i;j++)
    		printf("%c\n", szCiphertext[j]);
    
    	return 0;
    }
    
    void toNull (char *zeiger, int Limit)
    {int i;
    	for(i=0;i<Limit;i++)
    		*(zeiger+i)=0;}
    
    void readKey (char *key)
    {	printf("Bitte geben sie den Key ein\n");
    	gets(key);}
    
    void readText (char *text)
    {	printf("Bitte geben sie den zu verschluesselnden Text ein!\n");
    	gets(text);}
    

    Die codierung läuft richtig ab. d.h. das in szCiphertext stehen die richtigen werte drinnen. ich weis nur nicht wie ich die sinnvoll ausgeben kann, so das man das verschlüsselte auch wieder rückkodieren kann, heist ja im simpelsten fall schon das ich nur zeichen verwenden kann die auch auf der tastatur zu finden sind (oder macht mann das dann über zahlen??) aber ich kann ja beim einlesen net jeden buchstaben/Zahl einzeln einlesen; und so weis der compiler ja net obs 24 oder 2 und 4 heißt 😕 )
    wenn ein ä mit einem a kodiert wird kommt ja z.b -27 raus 👎

    danke für die Hilfe
    mfg kolbenfresser



  • ^^nimm einfach für die ausgabe zweistellige hexzahlen pro byte, die du hintereinenderklebst. beim einlesen dann immer aus zwei hexziffern den wert machen. btw: statt 'toNull()' kannste auch die fertige funktion 'memset()' nehmen. und bei gets() sollteste bedenken, dass es über den buffer hinausschreiben kann. nimm stattdessen fgets(), fread() oder sowas.



  • Genau. Un der Compiler hat nichts mit dem einlesen deiner Zahlen zu tun 😉



  • +fricky schrieb:

    ... beim einlesen dann immer aus zwei hexziffern den wert machen....

    wie meinst du das?? bei dem einlesen meinte ich natürlich die scanf funktion 👍
    danke!!



  • Hallo,

    das Problem ist das du Steuerzeichen beim Kodieren bekommst.
    Also ASCII-Werte < 0x20.

    Ich habe das Problem damit umgangen, dass ich einen Key nur
    mit ASCII-Werten > 0x7F verwendet habe, mit dem Nachteil das
    Umlaute nicht funktionieren, da sie ja ASCII-Werte > 0x7F haben
    und damit eben auch Steuerzeichen im Chipher Text erzeugen.

    Am schlimmsten ist natürlich der Stringterminator 0x00.

    Gruß,

    Andreas



  • ich hätts halt gern so das ich den text den ich bei der verschlüsselung erhalte, einfach erneut verschlüsseln lass, mit dem selben key natürlich, und dann wieder den ursprünglichen text erhalte. aber ich weis nicht wie das geht.
    😕



  • kolbenfrsser schrieb:

    ich hätts halt gern so das ich den text den ich bei der verschlüsselung erhalte, einfach erneut verschlüsseln lass, mit dem selben key natürlich, und dann wieder den ursprünglichen text erhalte. aber ich weis nicht wie das geht.

    das macht XOR schon automatisch, (ab)b ist wieder a. dein problem ist, dass du die ge-xor-ten daten nicht mehr als text ansehen darfst. erst nach der decodierung wieder. übrigens ist XOR zur verschlüsselung nur gut, wenn der key sehr lang ist.
    🙂



  • ok.

    habe ich des so richtig verstanden? ich lese den text und den key als char ein. dann zeichenweise XOR dann als Hexziffern ausgeben.
    soweit so gut.
    aber wie kann ich dann beim entschlüsseln die Zahlen wieder eingebn?? wenn ich dann z.b. 34 eingeb (was im dezimal system 52 entspricht) dann speichert mir die scanf funktion die 3 (:= ascii 51) ins erste feld und die 4 (:= ascii 52) ins zweite feld. wird dann XOR gemacht kommt kauderwelsch dabei raus. hast du icq fricky?? . würd mich freuen wennst dich melden würdest.
    danke



  • kolbenfrsser schrieb:

    aber wie kann ich dann beim entschlüsseln die Zahlen wieder eingebn?? wenn ich dann z.b. 34 eingeb (was im dezimal system 52 entspricht) dann speichert mir die scanf funktion die 3 (:= ascii 51) ins erste feld und die 4 (:= ascii 52) ins zweite feld. wird dann XOR gemacht kommt kauderwelsch dabei raus.

    scanf kann auch hexzahlen einlesen (mit %x). aber benutz mal die suchfunktion des forums. hier gibt's bestimmt über 100 threads, bei denen es um hex-umwandlung geht. im prinzip musste die erste ziffer (0...f) in einen wert zwischen 0...15 umwandeln, dann mit 16 malnehmen, die zweite ziffer ebenfalls in 0...15 umwandeln und beides addieren. du kannst es auch ohne hex anstellen, dann kannst die daten z.b. binär in einem file speichern (aber sinnvoll ansehen nur mit 'nem hexeditor o.ä.). wenn du die daten sichbar brauchst, kannste auch 'base64' statt hex nehmen. das format ist aber etwas koplizierter.

    kolbenfrsser schrieb:

    hast du icq fricky??

    nee.
    🙂



  • Arbeite mit unsigned char bei der Codierung/Decodierung

    Die Daten sind doch eh binär gespeichert.

    Ob ASCII oder Int etc ist doch nur die Betrachtungsweise
    bzw Darstellung.

    Gruß,

    Andreas



  • Er möchte aber die verschlüsselten Zeichen geren wieder eingeben und entschlüsseln. Da ist es nicht egal, da du nicht alles eingeben kannst.



  • habs jetz hinbekommen. wenns jemand interessiert dann kann ichs gern per mail schreiben. jetz würd ich noch gern ein schmankerl einbauen und zwar muss ich jetz noch die Zahlen die der Pc beim verschlüsseln ausspuckt (über printf) abschreiben und beim entschlüsseln wieder per hand eingeben. kann mann die auch in eine datei schreiben und aus dieser wieder auslesen??
    wie funktioniert das oder wonach muss ich suchen??
    danke für euere hilfe.



  • IMHO kann man alle Zeichen über die nummerische tastatur eingeben



  • Ja man kann mit einer Tastenkombination alle Zeichen als Hey Wert eingeben, fragt sich nur wenn ein CR und LF kommt, wie das Programm dann unterscheiden soll ob noch Zeichen kommen oder es ein ENTER war. Wäre schonmal das erste Problem.



  • Deshalb habe ich ja empfohlen so zu verschlüsseln, dass
    nur Werte > 127 also > 0x7F herauskommen, dann hat man
    kein Problem mit Steuerzeichen.

    Nachteil man kann keine Umlaute verschlüsseln.



  • Also wenn ich zum Beispiel ein G mit M verXORen will, bekomme ich ein LF raus. Wo ist da der Wert >127? Oder habe ich was falsch verstanden?

    01001101 (M)
    01000111 (G)
    ^ (XOR)
    00001010 (LF)

    Oder willst du sagen er muss drauf aufpassen das Klartext und Schlüssel beim Bitweisen XOR imme größer 127 ergeben müssen? Selbst das macht aber nicht viel Sinn, weil man das wohl schlecht jedes mal kontrollieren kann, als der der eingibt.



  • Nein, du darfst dein G nur mit Zeichen bei denen das höchste
    Bit 1 ist XORen also immer 0x80 zu deinem z.B M dazuaddieren.
    Dann bekommst du nie Steuerzeichen.



  • Ja das würde funktionieren. Ein Anforderung war aber:

    kolbenfrsser schrieb:

    hallo,
    1. Vom Benutzer wird ein Passwort (= Key) eingelesen.

    Und mit deinem Ansatz würde es das Programm dann noch unkonfortabler machen als es eh schon ist.
    Desweiteren würden die Bytes seines Chiffrats dann immer >127 sein und diese müssten zum entschlüsseln natrülich auch immer wieder umständlich mit Tastenkombinationen eingegeben werden.
    Aber darüber lohnt es sich auch nicht weiter zu diskutieren 😉


Log in to reply