Problem mit XoR
-
#include <stdio.h> #include <stdlib.h> #define MAX 20 int main(int argc, char *argv[]) { char key[] = "key"; char string[] = "crypt"; char encrypt[MAX]; int i; for (i=0; i<strlen(string); i++) { string[i] ^= key[i]; } printf ("%s\n",string); system("PAUSE"); return 0; }
Wenn ich den oben geposteten Code kompiliere dann erhalte ich als Ausgabe nur Sch*ißdreck.
Warum?
-
Ein ge"XoR"ter String sieht immer aus wie Sch*ißdreck. Das ist kein Fehler.
Aber in der for-Schleife muß noch berücksichtigt werden, daß "key[]" kürzer sein kann als "string[]".
-
Außerdem wird hier bei jedem Schleifendurchgang neu strlen mit dem veränderten String aufgerufen, was dazu führt, dass nach dem dritten Buchstaben Schluss ist (denn ('y'^'y')==0).
Zwei Fehler heben sich gegenseitig auf
-
Viel mehr würde eh nicht gehen (also höhere i), weil Plaintext und Schlüssel unterschiedlich groß sind und kein Modulo eingebaut ist.
-
Ja gut aber nemmen wir jetzt mal an "key" + "string" sind gleich lang.
Wieso kommt dann immer noch Sch*ißdreck raus?
-
XorProblem schrieb:
Ja gut aber nemmen wir jetzt mal an "key" + "string" sind gleich lang. Wieso kommt dann immer noch Sch*ißdreck raus?
vielleicht willst du lieber mit XOR32 nehmen.
string[i] ^= (key[i]&31);
kannste mit diesem dreck leben?
-
Ich will wissen wieso das so ist und nicht einen Code.
-
XorProblem schrieb:
Ich will wissen wieso das so ist und nicht einen Code.
-
Und wie soll mir das weiter helfen?
-
Meinst du mit Sch*** ASCII Zeichen > 127?
Ist doch klar, normaler Text ist immer ASCII < 127
und bei XOR Verknüpfung entstehen dann halt Sonderzeichen.Gruß,
Andreas
-
Vlado58 schrieb:
Meinst du mit Sch*** ASCII Zeichen > 127?
Ist doch klar, normaler Text ist immer ASCII < 127
und bei XOR Verknüpfung entstehen dann halt Sonderzeichen.Gruß,
Andreas
Bei mir kommt folgendes raus:
-
XorProblem schrieb:
Und wie soll mir das weiter helfen?
Denk ueber volkards Post nach. Da steckt die Quintessenz drinnen.
-
XorProblem schrieb:
Bei mir kommt folgendes raus:
'c'^'k' ergibt 8, das ist ein Backspace und wird nicht ausgegeben.
'r'^'e' ist 23, das ist eigentlich kein druckbares Zeichen sondern ein Steuerzeichen und wird unter Windows wohl als so ein komischer Pfeil ausgegeben, aus welchen Gründen auch immer.
'y'^'y' ergibt 0, das signalisiert das Ende des Strings, deswegen endet die Ausgabe da.