Caesar Verschlüsselung. Allgemeine Verschlüsselung.
-
Motors-Freak schrieb:
Wo gwenau finde ich die passenden Grundlagen? Wo genau sind sie am besten zusammen gefasst, auch für Anfänger?
In einem Buch. Vorzugsweise nicht dem von Jürgen Wolf.
-
Falls es auch relativ einfaches Englisch sein darf, gibts auch PDF-Downloads für z.B. "C Primer Plus (5th Edition)". Ist als Lehrbuch gestaltet und in jedem Fall besser als JW.
-
DAS muss in jeder Einführung in die C-Programmiersprache stehen.
Wie gut oder verständlich das ist, ist eine andere Sache.Und wenn du erstmal http://de.wikibooks.org/wiki/C-Programmierung nimmst.
-
Wutz schrieb:
Dass dir der Ansatz fehlt, ist völlig klar, da dir das Grundwissen über die Funktionalität der Standardbibliothek fehlt und u.a. damit auch ein Konzept zum Programmdesign.
Solche Vorwürfe finde ich überzogen. Klar, die Standardbibliothek ist überschaubar und nützlich, aber wer lernt die denn ernsthaft auswendig, bevor er die ersten Gehversuche macht? Ich zumindest hab die Bibliothek erst nach und nach schätzen gelernt.
Ich glaub auch nicht, dass man erst den Compiler anwerfen darf, wenn man ein Design-Konzept hat.
-
char i; // Alpha
encrypt_text[(i+key)%alphasize];
decrypt_text[(i-key+alphasize)%alphasize];
-
So mal ein kleines UPDATE!
Habe mir heute mit einem Kumpel mal dran gesetzt. Ich sag es mal so, also verschlüsseln macht das Programm schon mal. Das Problem ist, dass er auser dem korrekt verschlüsselten Wort/Satz auch noch viele "komische" Zeichen ausgibt. Ich gehe mak davon aus, dass es irgendein Teil des ASCII Codes oder einfach nur irgendwelche Speicher aus dem RAM ist. Und was mich noch viel mehr wundert, warum gibt er mein zu verschlüsselndes Wort am Ende noch mal unverschlüsselt aus???
Der Algorithmus ist so "klein", ich versteh das Problem nicht.Der jetztige Quellcode ist das absolute GRUNDGERÜST. Ich muss boß wissen wo das Problem im Moment liegt, warum er also zu dem richtigen Wort noch falsche Ziffern ausgibt. Anschließend baue ich es weiter auf.
Danke im Vorraus!void main() { char klar[5]; char geheim[5]; int i; printf("========================================\n"); printf("= Caesar-Verschluesselung =\n"); printf("========================================\n\n"); printf("Bitte geben sie den Klartext ein: \n"); gets(klar); for(i=0; i<5; i++) { geheim[i]=((klar[i]+1)); } printf("%s\n",geheim); }
-
[hier folgt nur Blödsinn]
Versuchs mal so:
#include <stdio.h> int main(void) // <------------ der Standard will das so { char klar[5] = {0}; // <---------- alle 5 auf null setzen char geheim[5] = {0}; // <---------- ebenso int i; printf("Bitte geben sie den Klartext ein: \n"); gets(klar); for(i=0; i<5; i++) { geheim[i]=((klar[i]+1)); } printf("%s\n",geheim); }
Hier geht alles gut, solange nicht mehr als 4 Zeichen eingegeben werden. Achte darauf, dass ein String immer mit einer Null (vulgo Nullzeichen) abgeschlossen werden muss.
Nachtrag:
Es ist nicht nötig,klar
zu nullen, weil es sowieso von gets() mit einer Null abgeschlossen wird. Aber schaden kann es auch nicht.
-
Nullterminierung vergessen. printf gibt von
geheim
an so lange Buchstaben aus, bis es auf eine 0 im Speicher trifft. Da am Ende von geheim keine 0 steht, geht es munter weiter bis zufällig irgendwo eine steht. Auf dem Weg dahin liegt anscheinend auch deine ursprüngliche Nachricht sowie anderer Speichermüll.Gibt dir dein Compiler eigentlich keine Warnungen bei der Benutzung von gets?
-
Vergiss meinen Post, das war Blödsinn. Versuch's lieber so:
#include <stdio.h> int main(void) { char klar[5]; char geheim[5]; int i; printf("Bitte geben sie den Klartext ein: \n"); gets(klar); for(i=0; klar[i]; i++) { geheim[i]=klar[i]+1; } geheim[i] = 0; printf("%s\n",geheim); }
Was gets() angeht, hat SeppJ völlig recht, dir davon abzuraten.
-
@mngbd: Dein korrekter Quelltext funktioniert auch nichtm bringt trotzdem noch Müll auf den Schirm,...
@SeppJ: Ja er bringt eine Warnmeldung, aber ich kenne keine andere Lösung. Scanf fällt hier ja auch weg und bei scnaf zeigt er auch eine Warnmeldung!
Und wieso anstatt
i<5
das:
klar[i]
Danke!
-
Gib mal ein Wort mit 4 Buchstaben ein
-
Klappt danke
Aber ich kann es nicht ganz nachvollziehen!Warum "klar[i]" anstatt "i<5" und warum kann ich einen Array wo 5 Ziffern rein gehen mit nur 4 füllen? Weil der letzte mit '\0' gefüllt ist?
Danke!
-
Bei Zeichenketten in C wird das Ende immer durch ein Nullzeichen markiert. Dies musst du verinnerlichen, wenn du in C mit Zeichenketten jemals was funktionierendes Programmieren willst. Hol dir am besten ein gutes
Buch in dem das erklärt wird, ein kleiner Forenbeitrag reicht da nicht.
Mit diesem Wissen ist es leicht deine zwei Fragen zu beantworten:
Warum "klar[i]" anstatt "i<5"?
Woher willst du wissen, dass deine Zeichenkette genau 5 Zeichen lang ist? Das Nullzeichen markiert das Ende, also gehst du so lange durch, bis du bei einem Nullzeichen ankommst.
warum kann ich einen Array wo 5 Ziffern rein gehen mit nur 4 füllen? Weil der letzte mit '\0' gefüllt ist?
Ja, deswegen.
-
Motors-Freak schrieb:
und warum kann ich einen Array wo 5 Ziffern rein gehen mit nur 4 füllen? Weil der letzte mit '\0' gefüllt ist?
Genau.
Motors-Freak schrieb:
Warum "klar[i]" anstatt "i<5"
i<5 ist eine Bedingung. Wenn die Bedingung wahr ist, ergibt sie einen Wert ungleich 0.
Also 0 ist unwahr (falsch, nicht richtig) und ungleich 0 ist wahr (richtig).
Da das letzte Zeichen im String 0 ist, ist an dieser Stelle die Bedingung unwahr und die Schleife ist zu Ende.
mngbd hätte auch ;klar[i] != 0; schreiben können (was sicher lesbarer ist, aber keine Nachteile hat
)
Das ist besser als i<5, falls du mal weniger als 4 Zeichen eingibst oder das Feld nicht 5 sonder z.B. 500 Zeichen Platz bietet.
-
Moin :xmas1:
#include <stdio.h> #include <stdlib.h> #include <string.h> int encode(char *dest, char *source, int len, int shift) { int i; if (shift <= 0) // weil wegen sicherheit ;) { return 0; } shift = shift % 26; // weil wegen sonntag for (i = 0; i < len; i++) { if (source[i] >= 'A' && source[i] <= 'Z') dest[i] = 'A' + ((source[i] + shift - 'A') % 26); // 'A' + stelle im alphabet else if (source[i] >= 'a' && source[i] <= 'z') dest[i] = 'a' + ((source[i] + shift - 'a') % 26); // man muss hier leider etwas tricksen else // da zB. 'z'+5 kein buchstabe mehr wär dest[i] = source[i]; // wir verändern nur buchstaben } dest[i] = 0; // '\0' müssen wir manuell einfügen return i; // i sollte jetzt > 0 sein ;) } int main() { char buffer[0x100]; char encoded[0x100]; int shift = 0; printf("Caesar-encryption\n"); while (shift <= 0) // man könnte hier auch gleich auf <= 26 prüfen.. { // aber ich rechne ja eh shift % 26. printf("Please enter shift: "); fgets(buffer, sizeof(buffer), stdin); // fgets um anzahl der einzulesenden zeichen kontrollieren zu können shift = atoi(buffer); // string zu int } printf("Please enter your text:\n"); fgets(buffer, sizeof(buffer), stdin); buffer[strlen(buffer) - 1] = 0; // eingelesendes '\n' los werden if (encode(encoded, buffer, strlen(buffer), shift)) //encode gibt true zurück wenn erfolgreich printf("encoded:\n%s", encoded); else printf("Error!"); getchar(); return 0; }
Könnte man bestimmt auch wunderbar mit
char big_lib[] = "ABCDEFGH .."; char small_lib[] = "abcdefgh ..";
sowas lösen
-
cooky451 schrieb:
printf("Please enter shift: "); fgets(buffer, sizeof(buffer), stdin); // fgets um anzahl der einzulesenden zeichen kontrollieren zu können shift = atoi(buffer); // string zu int
Manchmal frage ich mich ob ich irgendeinen tollen Trick nicht sehe oder ob etwas einfach nur dumm ist. So auch hier. Warum nicht direkt eine Zahl einlesen?
-
SeppJ schrieb:
cooky451 schrieb:
printf("Please enter shift: "); fgets(buffer, sizeof(buffer), stdin); // fgets um anzahl der einzulesenden zeichen kontrollieren zu können shift = atoi(buffer); // string zu int
Manchmal frage ich mich ob ich irgendeinen tollen Trick nicht sehe oder ob etwas einfach nur dumm ist. So auch hier. Warum nicht direkt eine Zahl einlesen?
Weil ich scanf() nicht mag?
-
Was ist eigendlich an scanf so böse?
Habe das nun schon öfters hier gelesen, daß scanf nicht so toll ist.
Was ist denn so problematisch daran?Gruß,
DC
-
Don Carsto schrieb:
Was ist eigendlich an scanf so böse?
Habe das nun schon öfters hier gelesen, daß scanf nicht so toll ist.
Was ist denn so problematisch daran?Gruß,
DCAn und für sich ist scanf() nicht böse.
Nur muss man beim Gebrauch aufpassen.char buffer[10]; scanf("%s", buffer);
Das wäre zB. ein typischer Fehler. Abgesehen davon dass undefiniertes Verhalten erzeugt wird falls mehr als 9 Zeichen eingegeben werden könnte man auch noch recht einfach einen exploit für ein Programm schreiben das etwas so einliest. (siehe http://de.wikipedia.org/wiki/Pufferüberlauf )
Das gilt aber für alle C-Funktionen (man möge mich schelten falls ich jetzt was falsches schreibe :D). C-Funktionen überwachen nunmal von selbst keine Speicherbereiche. So kann
char buffer[10]; fgets(buffer, 100, stdin);
genauso für einen exploit genutzt werden, nur ist scanf() besonders bei Anfängern die sich hier noch keine Gedanken machen als quasi-Gegenstück zu printf() sehr beliebt und wird somit halt oft "falsch" benutzt. (Viele vergessen beim einlesen von Zahlen auch gerne mal den Adressoperator..)
Dabei wohnt scanf() aber wie schon gesagt das Böse eigentlich nicht inne und kann in dieser Form:int num; char buffer[10]; scanf("%i", &num); scanf("%9s", buffer);
auch problemlos genutzt werden.
Ich mag es halt nur nicht weils sich auf der Konsole komisch verhält aber das ist ne andere Geschichte und auch nur eine persönliche Meinung :xmas1:
-
Hallo
Habe zur Zeit ein kleines Problem. Bin immer noch an meinem verschlüsselungs Programm bei.
Mein Problem Zur Zeit ist, dass ich NICHT in einer IF Anweisung das GETS benutzen kann. Genauso wenig NACH einer IF Anweisung. Das Programm überspringt dann alles und wartet gar nicht auf eine Eingabe, wieso nich? Benutze ich das GETS jedoch vor der ersten IF Anweisung funktioniert es Einwandfrei. In Der IF Anweisung oder danach funktioniert es nicht mehr. Wieso?Gruß