Hallo, soll einen verschlüsselten Text mit einem Programm entschlüsseln lassen. Das Passwort soll: Kirschsaft! lauten. Dabei sollen nur die jeweils 4 niederen Bits des Textes mit den niederen 4 bits des Schlüssels(Passwort) mit einem exklusiv oder manipuliert werden. Es handelt sich um Buchstaben aus dem ASCII Code. Meine Frage ist, warum mein Code nicht funktioniert. Code: #include <stdio.h> #include <stdlib.h> #define puffer 5000 int main() { FILE *geheim; char array[puffer]; char hilf, schluessel[20]; int i=0, c=0, x=0, z=0, f=0, h4, h2, h3, loesung; geheim = fopen ("geheim1.txt", "r"); if( geheim == NULL) { printf("fehler"); } else { printf("erfolg!\n"); while(feof(geheim)==0) { putchar(c++); c=fgetc(geheim); array[i] = c; i++; } printf("\nGeben sie das Passwort ein:\n"); gets(schluessel); printf("%s", schluessel); printf("\nDas Passwort hat %i Zeichen\n\n", strlen(schluessel)); for(x=0; x<=strlen(array); x++) { if(z==strlen(schluessel)) {z=0;} hilf = 0x0F & array[i]; h2 = 0x0F & schluessel[z]; h3 = 0xF0 & array[i]; h4 = hilf ^ h2; loesung = h3 | h4 ; putchar(loesung); i++; z++; } } } Danke für Antworten und falls ich mich nicht deutlich genug formuliert habe oder ihr noch fragen habt, dann gibt bitte Bescheid.
Appel0 A. schrieb: > Meine Frage ist, warum > mein Code nicht funktioniert. Was funktioniert denn nicht? Compiliert das nicht? Bekommst du nicht das ergebnis das du erwartest? Etwas mehr Informationen bitte...
nachdem du die Datei gelesen hast solltest du irgendwann die Variable "i" wieder auf Anfang==0 setzen :-). Das array könnte man auch noch zur Sicherheit mit '\0' initialisieren.
> putchar(c++); Was ist denn das fürn Schwachsinn? 'c' wird im nächsten Statement überschrieben, also schreib einfach 'c' statt 'c++'. > for(x=0; x<=strlen(array); x++) Das muss bestimmt 'x < strlen(array)' sein. Und damit diese Abfrage auch funktioniert soll 'array' nach dem Einlesen auch mit einem \0 abgeschlossen werden. Ausserdem würde ich für die ersten Gehversuchen Passwort und Text einfach als Konstanten im Programmtext reinschreiben anstatt direkt mit Dateien einlesen und Benutzerabfragen zu starten.
1 | char password[] = "Hallo!"; |
2 | char text[] = "Ultrageheime text"; |
3 | |
4 | int main() |
5 | {
|
6 | char *pwd_idx = 0; |
7 | for(int i = 0; i < strlen(text); i++) |
8 | {
|
9 | char t = text[i] & 0x0F; |
10 | t ^= password[pwd_idx] & 0x0F; |
11 | t |= text[i] & 0xF0; |
12 | |
13 | putchar(t); |
14 | |
15 | pwd_idx++; |
16 | if(password[pwd_idx] = '\0') pwd_idx = 0; |
17 | }
|
18 | printf("\n"); |
19 | }
|
Eric B. schrieb: >> for(x=0; x<=strlen(array); x++) > > Das muss bestimmt 'x < strlen(array)' sein. Und damit diese Abfrage auch > funktioniert soll 'array' nach dem Einlesen auch mit einem \0 > abgeschlossen werden. Der Aufruf von strlen ist so oder so unnötig:
1 | x = 0; |
2 | while(array[x] != '\0'){ |
3 | /* ... */
|
4 | x++; |
5 | }
|
Appel0 A. schrieb: > while(feof(geheim)==0) > { > putchar(c++); > c=fgetc(geheim); > array[i] = c; > i++; > > } Warum nicht liest du die Zeichenkete nicht einfach mit fgets ein? Appel0 A. schrieb: > gets(schluessel); Bitte, bitte, bitte verwende niemals gets! Siehe hier: Beitrag "Re: Wann Tastaturpuffer mit fflush(stdin); löschen?" Im allgemeinen sieht das Programm eher verzettelt aus. Versuche etwas Struktur in das Programm zu bringen, indem du Funktionen für einzelne und voneinander unabhängige Tätigkeiten, z.B. für das "Verschlüsseln", erstellst. Dann sind auch einzelne Variablen nicht über das gesamte Programm verstreut. Z.B. i wird an mehreren Stellen inkrementiert, aber niemals zurück auf null gesetzt. Bist du sicher, dass du nirgends auf den Speicher hinter dem Array zugreifst?
:
Bearbeitet durch User
Ich würde die (de)codier methode so umsetzen:
1 | // ungetestet
|
2 | void encrypt( char* text, size_t text_len, char* password, size_t password_len, size_t i ){ |
3 | for( ; i<text_len; i++ ) |
4 | text[i] = text[i] ^ ( password[ i % password_len ] & 0x0F ); |
5 | }
|
Cryptografisch ist das aber nicht sehr sicher, Sobald der Text mindestens 3-mal so lang wie das Passwort ist oder Grossbuchstaben enthält und sich nicht textlänge/passwortlännge mal wiederholt ist es zu rund 80% entschlüsselbar. Poste mal etwas Verschlüsseltes ohne das Passwort, und ich sage was das Passwort war.
O`g#Befhuao Bg"Kbeattc!gl`wff#{qah+Hofj{fo* O`g#tgomrao+gc`k(Btupsjekfm(qdowde' Ilk#Bdwnhe!j|d#gmq!El`~zqff$ Oh"wb|fo&miell#gaf!Dahel"tf`/ ^gf#gi#wcv{bjjwf|fo&whn)ufj{f Ohlm#ivg&`de)nfwrwdh$Un`n#gmq!Tahxl, Afc`kan!Tmollnmb|y Diesen Text soll ich entschlüsseln mit Bitmanipulation
Habe mir eure Ratschläge mal durchgelesen und werde wsl noch ein paar ausprobieren. Mein Passwort ist nur 11 Zeichen lang, müsste also mit gets einlesbar sein. Er gibt mir je nach Passwort ca. 3 Buchstaben aus, diese sind für unterschiedliche PW's unterschiedlich. Außerdem funktioniert die Zuweisung der Variablen des Textes zu array nicht, kann mir jemand weiterhelfen. #include <stdio.h> #include <stdlib.h> #define puffer 5000 int main() { FILE *geheim; int array[puffer], loesung[puffer], schluessel[20]; char hilf, h4, h2, h3; int i=0, c=0, j=0, n=0, h=0; geheim = fopen ("geheim1.txt", "r"); while(feof(geheim)==0) { c=fgetc(geheim); array[h] = c; putchar(c); h++; } // Text wird verschlüsselt gedruckt printf("\n\n %s", array); // eig sollte hier der verschlüsselte Text nochmals zur Kontrolle, ob array die Variablen erhalten hat, wiedergegeben werden, er gibt allerdings nichts aus. printf("\nGeben sie das Passwort ein:\n"); gets(schluessel); //Passwort: Kirschsaft! for(i=0; i<=599; i++) //bzw. while(loesung[i] != 0) { if(n==strlen(schluessel)) // if(schluessel[n]= '\0') { n=0; } else { hilf = 0x0F & array[i]; h2 = 0x0F & schluessel[n]; h3 = 0xF0 & array[i]; h4 = hilf ^ h2; loesung[i] = h3 | h4 ; i++; n++; } } printf("\n}n\n%s", loesung); }
Daniel A. schrieb: > Poste mal etwas Verschlüsseltes ohne das > Passwort, und ich sage was das Passwort war. Das ist ja einfach und auf dem ersten Blick zu sehen. Kirschsaft! Stand ja gleich zum Anfang da :)
Es werden nur wenige Buchstaben, je nach Passwort ausgegeben und diese stimmen nicht mit dem entschlüsselten Text überein. verschlüsselter Text: O`g#Befhuao Bg"Kbeattc!gl`wff#{qah+Hofj{fo* O`g#tgomrao+gc`k(Btupsjekfm(qdowde' Ilk#Bdwnhe!j|d#gmq!El`~zqff$ Oh"wb|fo&miell#gaf!Dahel"tf`/ ^gf#gi#wcv{bjjwf|fo&whn)ufj{f Ohlm#ivg&`de)nfwrwdh$Un`n#gmq!Tahxl, Afc`kan!Tmollnmb|y entschlüsselter Text: Die Ameisen In Hamburg lebten zwei Ameisen, Kal*vdleq`i/fhii+A|vqund`oo+rllvba& Bei Altona auf der Chaussee, Li$scwom%nafmj'fjo#Gb`fm$pgk& \de+dh%sb}r`iie}`k'|al*vniz` Kigd!juo%aba(eouqtlk%Sjae*enr)W`n|m' Hd`ccbo'Pldenmnjx zusätzlich steht in der Angabe: Wenn der Text Steuerzeichen (also Zeichen mit einem ASCII-Wert kleiner dem des Leerzeichens) enthält, dann werden diese nicht verändert, das entsprechende Zeichen aus dem Schüssel wird dabei ungenutzt übersprungen.
Appel0 A. schrieb: > Diesen Text soll ich entschlüsseln mit Bitmanipulation Von der Text soll jede Zeile einzeln eingelesen und mit dem Passwort entschlüsselt werden, nicht die ganze Text in einem Schritt. Prof um die Ohren hauen wenn er das nicht in der Aufgabenstellung beschrieben hat.
Appel0 A. schrieb: > zusätzlich steht in der Angabe: > Wenn der Text Steuerzeichen (also Zeichen mit einem ASCII-Wert kleiner > dem des Leerzeichens) enthält, dann werden diese nicht verändert, das > entsprechende Zeichen aus dem Schüssel wird dabei ungenutzt > übersprungen. Und was verbirgst du noch, was man braucht? Haben hier alle zuviel Zeit, um gerne eine Hausaufgabe zu erraten?
Ich vermute das sich das Problem darin befindet, dass array nicht die Variablen des Textes zugewiesen bekommt. while(feof(geheim)==0) { c=fgetc(geheim); array[h] = c; putchar(c); h++; } // Text wird verschlüsselt gedruckt printf("\n\n %s", array); // eig sollte hier der verschlüsselte Text nochmals zur Kontrolle, ob array die Variablen erhalten hat, wiedergegeben werden, er gibt allerdings nichts aus.
Eric B. schrieb: > Von der Text soll jede Zeile einzeln eingelesen und mit dem Passwort > entschlüsselt werden, nicht die ganze Text in einem Schritt. Prof um die > Ohren hauen wenn er das nicht in der Aufgabenstellung beschrieben hat. Profs und Lehrer sind grundsätzlich unfähig, oder was willst du damit sagen?
Appel0 A. schrieb: > er gibt allerdings nichts aus. wenn du die Antworten gelesen hättest: Strings werden in C mit 0 abegschlossen
Hier ein Vollständiges Programm nach den momentan bekannten Vorgaben:
1 | #include <stdio.h> |
2 | #include <string.h> |
3 | #include <stddef.h> |
4 | |
5 | int main( int argc, char* argv[] ){ |
6 | int c; |
7 | size_t i=0, n; |
8 | |
9 | if( argc != 2 ){ |
10 | fprintf( stderr, "Usage: %s [password] < in > out\n", argv[0] ); |
11 | return 1; |
12 | }
|
13 | |
14 | char* password = argv[1]; |
15 | |
16 | n = strlen( argv[1] ); |
17 | |
18 | while( ( c = getchar() ) != EOF ){ |
19 | if( (unsigned char)c >= ' ' ){ |
20 | c = c ^ ( password[i] & 0x0F ); |
21 | if( ++i >= n ) |
22 | i = 0; |
23 | }
|
24 | if( c == '\n' ) |
25 | i = 0; |
26 | putchar( c ); |
27 | }
|
28 | |
29 | return 0; |
30 | }
|
Dekodierter Text:
1 | Die Ameisen |
2 | |
3 | In Hamburg lebten zwei Ameisen, |
4 | Die wollten nach Australien reisen. |
5 | Bei Altona auf der Chaussee, |
6 | Da taten ihnen die Beine weh, |
7 | Und da verzichteten sie weise |
8 | Dann auf den letzten Teil der Reise. |
9 | |
10 | Joachim Ringelnatz |
Walter S. schrieb: > Eric B. schrieb: >> Von der Text soll jede Zeile einzeln eingelesen und mit dem Passwort >> entschlüsselt werden, nicht die ganze Text in einem Schritt. Prof um die >> Ohren hauen wenn er das nicht in der Aufgabenstellung beschrieben hat. > > Profs und Lehrer sind grundsätzlich unfähig, > oder was willst du damit sagen? Ich wollte damit sagen, dass man den Prof um die Ohren hauen sollte falls er die Aufgabenbeschreibung nicht vollständig definiert hätte. Es stellte sich aber heraus, dass es der Threadersteller war, und nicht der Prof, der die benötigte Infos nicht hergegeben hat.
Daniel A. schrieb: > Hier ein Vollständiges Programm nach den momentan bekannten Vorgaben: und deswegen kommen hierher immer Schüler/Studenten um sich die Hausaufgaben machen zu lassen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.