Pizzacorgie28 Geschrieben 1. Mai 2021 Geschrieben 1. Mai 2021 (bearbeitet) Moin Leute, ich versuche grade XOR Verschlüsselung / Symmetrische Verschlüsselung in C zu verwirklichen allerdings bis jetzt ohne viel Erfolg. Ich möchte das der User einen Text eingeben kann. Danach soll der User einen, 6 stelligen nummern, Key zum verschlüsseln angeben z.b. 930910. Daraufhin soll dann der Text mit dem Key zusammen durch XOR, verschlüsselt werden. Leider scheint was in der" char * xorencrypt(char * text, int * key) "etwas falsch zu laufen, da das Programm einfach beendet wird mit dem Error: Received signal :'Invalid Instruction'. Abort. #include <stdio.h> #include <stdlib.h> #include <string.h> char * xorencrypt(char * text, int * key) { size_t textlen = strlen(text); size_t keylen = strlen(key); char * encrypted = malloc(textlen+1); int i; for(i = 0; i < textlen; i++) { encrypted[i] = text[i] ^ key[i % keylen]; } encrypted[textlen] = '\0'; return encrypted; } int main(void) { char *text[99]; int *key=0; printf("Bitte Text eingeben:\n"); scanf("%99s",&text); printf("text=%s\n",text); printf("Bitte Key eingeben:\n"); scanf(" %d",&key); printf("key=%d\n",key); char * encrypted = xorencrypt(text, key); printf("%s\n", encrypted); //free(encrypted); return 0; } hoffe ihr könnt mir ein wenig weiter helfen sitze schon den ganzen tag dran und finde den Fehler einfach nicht. 🤯 Bearbeitet 1. Mai 2021 von Pizzacorgie28 Zitieren
Whiz-zarD Geschrieben 1. Mai 2021 Geschrieben 1. Mai 2021 Wieso ist in xorencrypt() key ein Zeiger auf ein Integer? Was erwartest du denn in, was bei key[i % keylen] rauskommen soll? Pizzacorgie28 reagierte darauf 1 Zitieren
Pizzacorgie28 Geschrieben 1. Mai 2021 Autor Geschrieben 1. Mai 2021 vor 9 Minuten schrieb Whiz-zarD: Wieso ist in xorencrypt() key ein Zeiger auf ein Integer? brauch ich die nicht? und der key soll jajedem buchstaben zugeordnet werden. z.b. h^913112=-80 Zitieren
Whiz-zarD Geschrieben 1. Mai 2021 Geschrieben 1. Mai 2021 vor 27 Minuten schrieb Pizzacorgie28: brauch ich die nicht? Weißt du überhaupt, was ein Zeiger ist? vor 27 Minuten schrieb Pizzacorgie28: und der key soll jajedem buchstaben zugeordnet werden. z.b. h^913112=-80 Verstehst du, was du da geschrieben hast? Weißt du, was die eckigen Klammern bedeuten? Zitieren
Pizzacorgie28 Geschrieben 1. Mai 2021 Autor Geschrieben 1. Mai 2021 Nur um klar zu stellen bin ziemlicher Noob und habe bereits den ganzen tag damit verbracht die kacke da zu schreiben nur damit es nicht funktioniert 😅. Deswegen bin ich grade ein wenig am ende xD. Habe um ehrlich zu sein auch deine frage hier nicht ganz verstanden vor 55 Minuten schrieb Whiz-zarD: Wieso ist in xorencrypt() key ein Zeiger auf ein Integer? und was ich mir hierbei gedacht habe weiß ich auch grade nicht mehr wirklich key[i % keylen]. bin grade einfach komplett im Tunnel und frustriert. Zitieren
Pizzacorgie28 Geschrieben 1. Mai 2021 Autor Geschrieben 1. Mai 2021 sooooooooooooooo ich habe den code noch mal neu verfasst und diesesmal es etwas knapper gehalten. allerdings auch nicht ganz fehlerfrei. #include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ int i = 0; char eingabe[99]; char key[6]="930913"; char output[13]; char decrypt[13]; printf("eingabe\n"); scanf(" %s", &eingabe); for(i = 0; i < 13; i++) { output[i] = eingabe[i]^key[i]; } printf("output XORed: %s\n\n", output); printf("\n"); for(i = 0; i < 13; i++) { decrypt[i] = output[i]^key[i]; } printf("Un XORed: %s\n\n", decrypt); printf("\n"); return 0; } ich kann zwar verschlüsseln und endschlüsseln bloß ist er momentan in der ascii Tabelle unterwegs und nicht binär wie ich es gerne hätte jetzt komm ich bloß nicht darauf wie ich ihn auf binär beschränken kann Zitieren
Whiz-zarD Geschrieben 1. Mai 2021 Geschrieben 1. Mai 2021 (bearbeitet) Ein Zeiger ist eine Variable, die statt den konkreten Wert die Speicheradresse zu diesem Wert besitzt. Eine Speicheradresse kann man sich vorstellen, wie eine Hausnummer, nur dass anstatt wir hier häuser Bytes haben. Die Adresse 0x1 (Hexadezimalschreibweise) ist das erste Byte im Speicher. int i1 = 3; // i1 hat den Wert 3 int* i2 = &i; // i2 hat als Wert die Speicheradresse von i1 Das &-Zeichen ist der sog. Adressoperator. Mit dem können wir die Adresse einer Variable abrufen. Darum geben wir bei scanf() die Adresse an, wohin der Wert geschrieben werden soll. Ich persönlich finde die Schreibweise von Zeigern, die man häufig in C-Beispielen findet, nicht so schöb, weil der Stern etwas tückisch ist. Der wird nämlich für zweierlei Dinge verwendet. Einmal für die Kennzeichnung eines Zeigers und einmal den konkreten Wert eines Zeigers zu ermitteln. Daher schreibe ich eher int* i2 = &i1; anstatt int *i2 = &i1; So wird es für mich deutlicher, dass es sich um einen Int-Zeiger handelt und der Stern nicht zum Variablennamen dazugehört. int main() { int i1 = 3; // i1 hat den Wert 3 int* i2 = &i1; // i2 hat als Wert die Speicheradresse von i1 printf("Wert i1: %d\n", i1); printf("Adresse i1: %p\n", &i1); printf("Wert i2: %p\n", i2); printf("Adresse i2: %p\n", &i2); printf("Inhalt i2: %d\n", *i2); return 0; } Da kommt jetzt z.B. sowas raus: Wert i1: 3 Adresse i1: 0x7ffd27627e44 Wert i2: 0x7ffd27627e44 Adresse i2: 0x7ffd27627e48 Inhalt i2: 3 i2 hat jetzt nun als Wert die Speicheradresse von i1. Liegt aber in einem anderen Speicherbereich und der konkrete Inhalt ist die Zahl 3. Ein String wird in C als Array von Characters dargestellt. Ein Array ist wiederum eine Sonderform eines Zeigers. Die Variable zeigt auf das erste Element des Arrays. int main() { char text[] = "Hallo Welt"; printf("Inhalt text: %c\n", *text); printf("Wert text: %p\n", text); return 0; } Da kommt z.B. das dabei raus. Inhalt text: H Wert text: 0x7fff5582eead Der Inhalt ist einfach 'H' und als Wert die Adresse. Die Eckigen Klammern, z.B. bei text[2] ist ein indexierter Zugriff. Wir haben es dann hier mit einer Zeiger-Aritmethik zu tun und zwar wird der Zeiger um zwei Stellen verschoben. Da er weiß, dass es sich hier um ein Char-Array handelt und ein Char ein Byte groß ist, weg er nun von der Speicheradresse zwei Bytes weiter. In unserem Beispiel wäre dies das Zeichen 'l'. Bearbeitet 1. Mai 2021 von Whiz-zarD StefanE und Pizzacorgie28 reagierten darauf 2 Zitieren
Whiz-zarD Geschrieben 1. Mai 2021 Geschrieben 1. Mai 2021 (bearbeitet) gelöscht Bearbeitet 1. Mai 2021 von Whiz-zarD Zitieren
Pizzacorgie28 Geschrieben 1. Mai 2021 Autor Geschrieben 1. Mai 2021 Danke nochmal für deine Erklärung bin ich nicht weiter drauf eingegangen sry also was ein zeiger ist ist mir zumindest schon klar . Allerdings ist das mit dem * echt bescheiden und finde ich persönlich auch mega hässlich finde das in C#bzw. c++ besser gelöst aber was will man machen . Aber das mit den [ ] habe ich bis jetzt tatsächlich noch nie verstanden dank dir 🤙 Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.