Caesar Verschlüsselung. Allgemeine Verschlüsselung.



  • Hallo Leute!
    Da mir hier bei meiner letzten Frage so hervorragend geholfen wurde bin ich nun auf einem kleinen "C-Trip" 🙂
    Unsere nächste Aufgabe wird seine einen Text zu verschlüsselung.
    Es soll reichen die Caesar verschlüsselung anzuwenden. Aber umso effektiver umso besser. Leider bin ich wirklich noch ein absoluter Anfänger!
    Meine Programm habe ich mir wie folgt vorgestellt:
    -Man kann einen Text eingeben und anschießend auswählen um wie viel stellen die Buchstaben verschoben werden sollen.
    -Man soll auch Sätze eingeben können, also mit Leerzeichen

    Mein Problem ist jetzt, dass ich noch sogut wie gar keine Grundlagen über Strings habe. Die einzigen String-Befehle die ich kenne sind:
    -strcpy
    -strcmp
    -strcat

    Die einzigen Bibliotheken die ich kenne sind in meinem Programm oben angegeben. Ich habe schon viel gegoogelt aber die meisten Algorithmen sidn mir zu schwer und da ich die Befehle nicht kenne kann ich dann mit dem Algorithmus nichts anfanngen. Ich will auf keinen Fall eine Lösung! Ich möchte bloß Tipps haben. Befehle die ich nutzen kann usw.
    Meine Programm steht wirklich noch in den Startlöchern, hier der Code:

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    
    void main()
    {
    	char klartext[200];
    	char geheimtext[200];
    	int i;
    	int laenge;
    	int key=3;
    	printf("========================================\n");
    	printf("=	Caesar-Verschluesselung        =\n");
    	printf("========================================\n\n");
    
    	printf("Bitte geben sie ihren Klartext ein.\nDer Text darf max 200 Zeichen lang sein");
    	scanf("%s",&klartext);
    
    }
    

    Als erstes möchte ich, dass er prüft wie lang mein eingegebenes Wort/Satz ist. Das Programm soll ersteinmal gaaaanz simpel sein. Ich möchte es Stück für Stück verbessern und Aufbauen.
    Ich weiß, dass ich nun eine for-Schleife einbauen müsste. Mir fehlt nun der komplette Ansatz zu der Programmierung.
    Würde mich über ein paar Tipps und Denk-Anstoßer sehr freuen.

    Gruß



  • 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.
    Erwartest du hier einen auf dich zugeschnittenen Grundkurs zur Programmentwicklung in C? Dann bist du hier falsch, liefere konkrete Probleme mit der Sprache ab und dir hilft dabei evtl. jemand.
    Du verwendest void main
    du setzt für "%s" &klartext ein
    ...
    alles weitere Hinweise, dass dir die absoluten Grundlagen fehlen und du die dir hier bisher gegebenen Hinweise ignorierst.



  • Wozu benötigst du "string-Befehle" für diese Aufgabe?

    Angenommen du hast einen Text:

    char text[6]="Hallo";
    

    Dann liegt der als Array so vor:

    text[0] = 'H';
    text[1] = 'a';
    text[2] = 'l';
    text[3] = 'l';
    text[4] = 'o';
    text[5] = '\0';
    

    Mache ich nun folgendes:

    char text[6] = "Hallo";
    
    printf("%s",text);
    
    text[0] = text[0] + 2; 
    
    printf("%s",text);
    

    Dann gibt er zunächst Hallo aus.
    Anschließend aber Jallo.
    Woran mag das liegen?

    Achso, hier noch ein Link, mit etwas, was du bestimmt brauchen wirst:

    http://www.tcp-ip-info.de/tcp_ip_und_internet/ascii.htm

    Gruß,
    DC



  • Motors-Freak schrieb:

    Mein Problem ist jetzt, dass ich noch sogut wie gar keine Grundlagen über Strings habe.

    Dann ist genau jetzt der Zeitpunkt sich diese Grundlagen anzueignen. Denn dafür ist diese Aufgabe gemacht.

    ⚠ Es sind wichtige Grundlagen.



  • DirkB schrieb:

    Motors-Freak schrieb:

    Mein Problem ist jetzt, dass ich noch sogut wie gar keine Grundlagen über Strings habe.

    Dann ist genau jetzt der Zeitpunkt sich diese Grundlagen anzueignen. Denn dafür ist diese Aufgabe gemacht.

    ⚠ Es sind wichtige Grundlagen.

    Wo gwenau finde ich die passenden Grundlagen? Wo genau sind sie am besten zusammen gefasst, auch für Anfänger?

    Danke schonmal an Alle!


  • Mod

    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.


  • Mod

    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!


  • Mod

    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!


  • Mod

    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 😃


Anmelden zum Antworten