Xor Verschlüsselung [C]
-
Hallo,
ich versuche einen Text mittel Xor zu verschlüsseln:int crypt(char *str,int *pass,int len) { int i,x; for(x=0; x<len; x++) { i = (int)str[x]; i = i ^ *pass; str[x] = (char)i; } }
Nur leider scheint dieser Code nicht so wirklich zu funktionieren weil sonst würde ich andere Ergebnisse erhalten.
-
void xor1 (char *s, size_t alen, char *k, size_t klen) { size_t i; for (i=0; i<alen; i++) s[i] ^= k[i%klen]; } void xor2 (char *s, char *k) { xor1 (s, strlen(s), k, strlen(k)); } int main (void) { char s[] = "hello"; char k[] = {31, 10, 30, 0, 11}; printf (s); xor1 (s, strlen(s), k, sizeof(k)); printf (" %s\n", s); }
-
kann mir jemand erklaeren wieso sein code nicht funktioniert? ich finde den fehler nicht
-
hmpf schrieb:
kann mir jemand erklaeren wieso sein code nicht funktioniert? ich finde den fehler nicht
Vielleicht funktioniert er ja und er haut sich bloß Stringterminierende Nullen in das Cryptat.
-
Danke für den Code würde aber gerne mal meinen Fehler finden:
#include <stdio.h> #include <string.h> #include <conio.h> int crypt(char *str,char *pass,int len) { int i,x; for(x=0; x<len; x++) { i = (int)str[x]; i = i ^ *pass; str[x] = (char)i; } } int decrypt(char *str,char *pass,int len) { int i,x; for(x=0; x<len; x++) { i = (int)str[x]; i = i ^ *pass; str[x] = (char)i; } } int main() { char buf[128],pw[30]; int i; printf("Menue\n"); printf("<1> Verschluessele String\n"); printf("<2> Entschluessele String\n"); printf("<3> Exit\n"); printf("\nIhre Auswahl: "); scanf("%i",&i); fflush(stdin); switch (i) { case 1: printf("String der Verschluesselt werden soll: "); fgets(buf,128,stdin); printf("Passwort: "); fgets(pw,30,stdin); crypt(buf,pw,128); printf("String verschluesselt: %s\n",buf); break; case 2: printf("String der Entschluesselt werden soll: "); fgets(buf,128,stdin); printf("Passwort: "); fgets(pw,30,stdin); decrypt(buf,pw,128); printf("String entschluesselt: %s\n",buf); break; case 3: return 0; } return 0; }
Hier mal der gesamt Code..
-
hi
Was machst du da genau ? zbsp. in der encrypt funktion ?
Du xor'st da jeder buschstabe mit dem ersten buchstaben in deinem password array!
Das kannst du nicht, bzw. macht überhaupt keinen sinn.! Nicht den kleinsten!
Du könntest das so machen das du zbsp.char string[]={"hallo ich verschüssle den text !"};
char key[]={"password"};Zuerst die länge des strings berechnen. strlen(string);
Dan dein password so lange in ein array hintereinader kopieren bis die länge gleich auf mit deinem string ist.Danach kannst du xor-en.for(i=0;i<len;i++) { ciphertext[i] = string[i] ^ key[i]; } ciphertext[len]='\0'; printf("%s",ciphertext);
Aber behalte immer im hinterkopf, das sich diese verschlüsselung sehr leicht knacken lässt !
lowbyte
-
Machs doch so:
void crypt(char *str, char *pass, int len) { char i; int x; for(x=0; x<len; x++) { i = str[x]; i = i ^ *pass; str[x] = i; } } int main() { char *Klar=malloc(7); // Vermutlich kann man nicht in konstante Strings schreiben. strcpy(Klar, "Geheim"); char pw=32; crypt(Klar, &pw, 6); printf("Crypt%s\n", Klar); crypt(Klar, &pw, 6); printf("Crypt%s\n", Klar); return 0; }
-
hi markus
Der gleiche fehler wider.
Ihr Xor-t immer mit dem gleichen buchstaben, und zwar mit dem erstenkannst ja nicht einfach:
c = i^*pass;
und dan hoffen das er bei jedem schleifen durchlauf den pointer um eins incrementiert !. ???
wenschon
c = i^*(pass+len);
aber dan müsstest du schon sicherstellen das dein password die gleiche länge wie der string aufweisst.
lb
-
hi
Oder wen du nich möchtest das dein Password die gleiche länge hat.
kannst du auch einfach:
c = i ^ *(pass+(len%passlen)); // modulo die passwordlänge
lowbyte
-
hi,
bei fgets() bekommst du am Ende( also vor dem abschliessenden '\0' ) noch den Zeilenumbruch mitgeliefert, deshalb sollte man dass Zeichen vor dem verschluesseln noch eliminieren:
fgets(buf,128,stdin); buf[strlen(buf)-1]=0;
die decrypt funktion kannst du dir schenken, da der witz der xor verschluesselung ist, das beim 2maligen verschluesseln der original wert wiederhergestellt wird.
also einfach die crypt funktion nochmals aufrufen.
das verschluesseln kann man mittels pointer ziemlich simpel schreiben ( der Einfachheit halber nur mit 1 Buchstaben verschluesselt ):void crypt(char *str,char *pass){ for(;*str; *str++ ^= *pass); }
bei Strings kann man mit (*str==0 ) einfach auf das String Ende abfragen.