Pizzacorgie28 Geschrieben 3. Mai 2021 Geschrieben 3. Mai 2021 Moin leute, ich versuche grade den text welcher vom user eingegeben wird über xor zu verschlüsseln und wieder zu entschlüsseln mit einem vorgegebenen key. Der text wird zwar ver und auch endschlüsseld aber standig werdn kryptische zeichen hinzugefügt auserhalb der eingabe (siehe anhang eingabe war hallohallo). leider finde ich nicht den fehler hoffe einer von euch kann mir helfen . #include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ int i = 0; char eingabe[99];//Text eingabe des Users char key[6]="930901";//Verschlüsselungs Key char output[99]; char decrypt[99]; printf("eingabe\n"); scanf(" %s", &eingabe); size_t eingabelen = strlen(eingabe); printf("strin=%d, von eingabelen\n",eingabelen); for(i = 0; i < eingabelen; i++) { output[i] = eingabe[i]^key[i]; //XOR verschlüsselung printf("\n%d",i); } printf("\noutput XORed: %s\n", output); //printf("\n"); for(i = 0; i < eingabelen; i++) { decrypt[i] = output[i]^key[i]; //XOR entschlüsselung } printf("Un XORed: %s\n\n", decrypt); printf("\n"); return 0; } Danke für euer Hilfe 🤘 Zitieren
Whiz-zarD Geschrieben 3. Mai 2021 Geschrieben 3. Mai 2021 Wie soll auch das funktionieren, wenn dein Text länger ist als dein Key? output[i] = eingabe[i]^key[i]; //XOR verschlüsselung Dein Key muss zwangsläufig genauso lang sein, wie dein zu verschlüsselnder Text. In anderen Sprachen würdest du eine "Index out of Range"-Exception bekommen. C hat aber keine Bereichsüberprüfung und er greift nun mit key[i] auf einen ungeschützten Bereich, wenn der Text länger ist, als der Schlüssel. Pizzacorgie28 reagierte darauf 1 Zitieren
Pizzacorgie28 Geschrieben 3. Mai 2021 Autor Geschrieben 3. Mai 2021 ahhh ok macht sinn haste recht. hmmmm bloß wie passe ich den key jetzt dem wort an ? 🤔 Zitieren
Whiz-zarD Geschrieben 3. Mai 2021 Geschrieben 3. Mai 2021 Das ist jetzt dir überlassen. Ich kenne die Anforderungen nicht. Zitieren
Pizzacorgie28 Geschrieben 3. Mai 2021 Autor Geschrieben 3. Mai 2021 Jo ich versuche mich mal dran also im Endeffekt ka maximal 100 Zeichne oder so hätte ich jetzt gesagt. Habe da keine speziellen Anforderungen mache ich grade nur Interesse halber noch nebenbei außerhalb der aufgaben. Der Rest läuft soweit dank euch 🤙 Zitieren
Pizzacorgie28 Geschrieben 3. Mai 2021 Autor Geschrieben 3. Mai 2021 Hmm hast du da vlt nen tipp komme da auf keinen grünen zweig for(i=0;i<strlen(eingabe);) { for(j=0;(j<strlen(key))&&(i<strlen(eingabe));j++) { numkey[i]=key[j]-'a'; i++; } } for(i=0;i<strlen(eingabe);i++) { numcipher[i]=numstr[i]+numkey[i]; } for(i=0;i<strlen(eingabe);i++) { if(numcipher[i]>25) { numcipher[i]=numcipher[i]-26; } } habe versucht damit den key an die eingabe anzupassen kommt aber auch nur murx raus Zitieren
Whiz-zarD Geschrieben 3. Mai 2021 Geschrieben 3. Mai 2021 Was soll denn dabei rauskommen? Wie willst du denn den Key an die Eingabe anpassen? Dein Key ist ein Array mit sechs Elementen: char key[6]="930901";//Verschlüsselungs Key Mehr als sechs kann dein Key nicht groß sein. Zitieren
Pizzacorgie28 Geschrieben 3. Mai 2021 Autor Geschrieben 3. Mai 2021 ahhhhhhhhh dann kann das garnicht erst funktionieren haste recht. hmm aber jetzt so geändert ohne sichtliche änderung char *key[]="930901";//Verschlüsselungs Key Zitieren
Whiz-zarD Geschrieben 3. Mai 2021 Geschrieben 3. Mai 2021 Jetzt hast du ein Zeiger von einem Zeiger und dennoch hat dein Array weiterhin nur sechs Elemente. Nimm doch mal ein Stück Papier und schreibe bzw. male auf, was du erreichen möchtest. Zitieren
StefanE Geschrieben 3. Mai 2021 Geschrieben 3. Mai 2021 Kleine Randnotiz: Du darfst gerne in der Code-Box unten rechts die Sprache für das Syntax Highlighting wählen @Pizzacorgie28 Pizzacorgie28 reagierte darauf 1 Zitieren
Pizzacorgie28 Geschrieben 3. Mai 2021 Autor Geschrieben 3. Mai 2021 ok also kann den key ja in der theorie wiefolgt ändern. char key[99]="930901" somit habe ich den array auf max 99 zeichen erhöht oder nicht? Und somit kann key die eingabe welche auch max 99 zeichen hat erreichen. jetzt ist bloß die frage inwiefern ich key der eingabe anpasse. im endefekkt müsste ja das programm die länge von dem array der eingabe mit dem array des keys vergleichen und dementsprechnd verlängern oder nicht? Zitieren
Whiz-zarD Geschrieben 3. Mai 2021 Geschrieben 3. Mai 2021 Und wie willst du den Key verlängern? Was machst du bei längeren Texten? Ist es nicht Verschwendung von Speicher, wenn der Text kürzer ist? Zitieren
Pizzacorgie28 Geschrieben 3. Mai 2021 Autor Geschrieben 3. Mai 2021 vor 1 Minute schrieb Whiz-zarD: Und wie willst du den Key verlängern? das ist die frage 😂 vor 4 Minuten schrieb Whiz-zarD: Was machst du bei längeren Texten? die Eingabe wollte ich erst mal auf 100 Zeichen beschränken . vor 2 Minuten schrieb Whiz-zarD: Ist es nicht Verschwendung von Speicher, wenn der Text kürzer ist? und ja das aufjedenfall aber das speicherproblem gehe ich an wenn ich mehr in der Materie stecke 😅 Zitieren
Pizzacorgie28 Geschrieben 3. Mai 2021 Autor Geschrieben 3. Mai 2021 Soooo ein wenig überarbeitet. allerdings spuckt er immer noch wirres zeug aus #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i = 0; char eingabe[99] = "This is a test string"; char key[99] = '930901'; // Encryption key char output[99]; char decrypt[99]; size_t eingabelen = strlen(eingabe); size_t key_len = strlen(key); for (i = 0; i < eingabelen; i++) { output[i] = eingabe[i] ^ key[i % key_len]; // XOR verschlüsselung } printf("\noutput XORed: %s\n", output); for (i = 0; i < eingabelen; i++) { decrypt[i] = output[i] ^ key[i % key_len]; // XOR entschlüsselung } decrypt[i] = 0; // Zero terminate printf("Un XORed: %s\n\n", decrypt); printf("\n"); return 0; } Zitieren
Rienne Geschrieben 3. Mai 2021 Geschrieben 3. Mai 2021 Es ist zwar ewig her, dass ich mich mit Verschlüsselungsmethoden beschäftigt habe, aber war es nicht so, dass man den Key einfach erneut von vorne benutzt, sobald man die Länge des Keys erreicht hat? Zitieren
Pizzacorgie28 Geschrieben 3. Mai 2021 Autor Geschrieben 3. Mai 2021 Gerade eben schrieb Rienne: aber war es nicht so, dass man den Key einfach erneut von vorne benutzt, sobald man die Länge des Keys erreicht hat? genau so hatte ich mir das auch vorgestellt aber ich weiß nicht so genau wie ich das umsetzte. Zitieren
Rienne Geschrieben 3. Mai 2021 Geschrieben 3. Mai 2021 Liegt vielleicht daran, dass du das Array vom Key auf 99 Zeichen gesetzt hast, aber der Inhalt nur 6 Zeichen lang ist. Zitieren
Whiz-zarD Geschrieben 3. Mai 2021 Geschrieben 3. Mai 2021 vor 8 Minuten schrieb Rienne: Liegt vielleicht daran, dass du das Array vom Key auf 99 Zeichen gesetzt hast, aber der Inhalt nur 6 Zeichen lang ist. Würde ich auch mal vermuten. Hab mich aber schon lange nicht mehr mit C beschäftigt. Die Initialisierung ist ja vom System abhängig. Unter Linux werden Variablen mit 0 initialisiert. Unter Windows gar nicht. Da könnte durchauch Datenmüll drinnenstehen. Da sollte man immer schauen, dass man Variablen sinnvoll initialisiert. Zitieren
Pizzacorgie28 Geschrieben 3. Mai 2021 Autor Geschrieben 3. Mai 2021 hmm gute frage selbst wenn ich den array komplett fülle kommt da ihrgentwie murx bei raus Zitieren
KeeperOfCoffee Geschrieben 3. Mai 2021 Geschrieben 3. Mai 2021 (bearbeitet) Uhm ... ich mach ja sonst nichts mit C++, aber im ersten Post war Key mit Anführungszeichen, im zweiten mit einfach Anführungszeichen. Wenn ich deinen zweiten Codesnippet auf cpp.sh teste funtkioniert er nur mit normalen Anführungzeichen... Bearbeitet 3. Mai 2021 von KeeperOfCoffee Zitieren
Rienne Geschrieben 3. Mai 2021 Geschrieben 3. Mai 2021 (bearbeitet) vor 7 Minuten schrieb Pizzacorgie28: hmm gute frage selbst wenn ich den array komplett fülle kommt da ihrgentwie murx bei raus Welchen Array und wie? Wenn der Key doch sowieso fest ist, kannst du doch auch von Anfang an die Länge anpassen. Also char key[6] = "930901"; // Encryption key size_t key_len = 6; Bearbeitet 3. Mai 2021 von Rienne Zitieren
Pizzacorgie28 Geschrieben 3. Mai 2021 Autor Geschrieben 3. Mai 2021 vor 2 Minuten schrieb KeeperOfCoffee: Uhm ... ich mach ja sonst nichts mit C++, aber im ersten Post war Key mit Anführungszeichen, im zweiten mit einfach Anführungszeichen. Wenn ich deinen Code auf cpp.sh teste funtkioniert er nur mit einfachen Anführungzeichen... kannst du einmal reinschreiben was du meinst? " " ? oder ' ' die gehen nämlich nicht hatte das testweise versucht ohne erfolg veregesen das wieder zu ändern vor dem einfügen. Gerade eben schrieb Rienne: Welchen Array und wie? oh sry key meinte ich einfach den key also 930901 so heufig hintereinander geschrieben bis array voll xD Zitieren
Whiz-zarD Geschrieben 3. Mai 2021 Geschrieben 3. Mai 2021 vor 3 Minuten schrieb KeeperOfCoffee: Uhm ... ich mach ja sonst nichts mit C++, aber im ersten Post war Key mit Anführungszeichen, im zweiten mit einfach Anführungszeichen. Stimmt. Hab es mal Online ausgeführt. Die einfachen Anführungszeichen führen bei einem Online Compiler zu einem Compilefehler. Wenn ich sie durch doppelte Anführungszeichen ändere, dann sieht es gut aus. Zitieren
Pizzacorgie28 Geschrieben 3. Mai 2021 Autor Geschrieben 3. Mai 2021 also ich bekomme das hier raus Zitieren
Whiz-zarD Geschrieben 3. Mai 2021 Geschrieben 3. Mai 2021 Das ist auch richtig. Die ersten 32 Zeichen im ASCII sind Steuerzeichen und sind nicht druckbar. m[YJ => this Das nächste Zeichen ist "Data Link Escape": Zeichen ASCII-Wert Binär Leerzeichen 32 0010 0000 0 48 0011 0000 0010 0000 ^ 0011 0000 ----------- 0001 0000 10000 ist in Dezimal 16 und somit das Steuerzeichen "Data Link Escape". 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.