Problem bei der Vignere verschlüsselung



  • Moin,
    ich habe mich mal drangesetzt und möchte die Vigenre-verschlüsselung programmieren. Bisher habe ich das hier:

    #include <stdio.h>
    
    int main ()
        {    char schluessel [100];
             char codiert [100];
             char text [100];
             int laesch,x,laeco,laete;
             printf ("Dies ist ein Codierer für die Vignere-Verschluesselung\n");
             printf ("Bitte geben sie ihren Schluessel ein\n");
             fgets (schluessel, 100, stdin);
             laesch=strlen(schluessel);
             printf ("Für Entschluesselung drücken sie bitte die 1\n");
             scanf ("%d\n)",&x);
             printf ("Für Verschluesselung drücken sie bitte die 2\n");
             scanf ("%d\n)",&x);
    
             case (x)
                  { case 1:
                         printf ("Bitte geben sie den Text ein\n");
                         fgets (codiert, 100,stdin);
                         laeco=strlen(codiert);
    
                  case 2:
                        printf ("Bitte geben sie den Text ein\n");
                         fgets (text, 100,stdin);
                         laete=strlen(text);
    

    Nun komme ich aber nicht weiter, da ich jetzt nicht weiß, wie ich BUchstaben im Hexadezimalsystem vershcieben kann und wie ich einzelne Buchstaben auslese aus dem Strings. Jemand eine Idee?



  • Lies ein C-Buch. Am besten eins zum anfassen aus Papier.
    Lies es nochmal.

    Da steht auch ein Beispiel für switch/case drin.



  • es geht garnicht um switch/case, sondern um das auslesen einzelner Zeichen aus einem array, sowie deren Umändern per Hexadezimalcode.....



  • Du stellst ein Frage, lieferst nicht compilierbaren Code dazu und legst fest, woran es nicht liegen kann?
    Liefere compilierbaren Code und Funktionen, die entsprechende Parameter für deinen Anwendungsfall besitzen und von mir aus deine Verschlüsselung in Prosa enthalten und sonst leer sein dürfen. Vielleicht hilft dir dann jemand weiter.



  • so, habe nochmal dran gearbeitet, mein Problem besteht jetzt weniger in dem Bearbeiten der zeichen des Strings, als viel mehr darin, dass es sich icht um die korrekte Vigenere Verschlüsselung handelt. Ich gehe bei meine programm davon aus, dass das Schlüsselwort nur aus Großbuchstaben besteht, der text nur aus kleinbuchstaben, leerzeichen sollen leerzeichen bleiben. Nur wie schon erwähnt, bleiben Leerzeichen keine Leerzeichen und die verschlüsselung funktioniert nicht (Ich möchte eine Vigenere Verschlüsselung, die nur aus großbuchstaben besteht).

    #include <stdio.h>
    #include <string.h>
    
    int main ()
        {    char schluessel [100];
             char codiert [100];
             char text [100];
             int laesch,x,laeco,laete,i,k,spalte, zeile;
             printf ("Dies ist ein Codierer für die Vignere-Verschluesselung\n");
             printf ("Für Entschluesselung drücken sie bitte die 1\n");
             printf ("Für Verschluesselung drücken sie bitte die 2\n");
             scanf ("%d)",&x);
    
             i = 0;
             k = 0;
    
             switch (x)
                  { case 1:
                         printf ("Bitte geben sie ihren Schluessel ein\n");
                         fgets (schluessel, sizeof(schluessel), stdin);
                         laesch=strlen(schluessel)-1;
                         printf ("Bitte geben sie den Text ein\n");
                         fgets (codiert, sizeof(text),stdin);
                         laeco=strlen(codiert);
                         break;
                  case 2:
                         printf ("Bitte geben sie ihren Schluessel ein\n");
                         fgets (schluessel, sizeof(schluessel), stdin);
                         laesch=strlen(schluessel)-1;
                         getchar();
                         printf ("Bitte geben sie den Text ein\n");
                         fgets (text, sizeof(text),stdin);
                         laete=strlen(text)-1;
                         getchar();
    
                           /* i= länge text, k= länge schlüssel */
                          for(i = 0, k = 0; i <= laete - 1; ++i, ++k) {
                          if(k > laesch){ k = 0;}
                          codiert [i] = 0;
    
                          /*codieren*/
                          if (65<=spalte<=122)
                          {spalte = (int)text[i] - 97;
                          zeile    = (int)schluessel[k] - 65;
                          codiert[i] = (char)((spalte + zeile-1)+ 65);}
    
                          /*leerzeichen*/
                          if (65>=spalte>=122)             
                          {spalte = (int) text[i];
                          codiert[i] = (char) (spalte);}
    
                          fflush(stdin);}
                          break;
                          }
    
        printf("%s\n", codiert);
        getchar();
        return(0);
    
    }
    

    Ich denke, ich ahbe iwo einen Fehler bei der Umrechnung der Werte für die Buchstaben, aber ich komme einfach nicht drauf.

    EDIT: Er gint z.B. wenn ich aaaaaaaaaaaaaaaaaaaa mit AAAAAAAAAAAAAAAAAAAAA verschlüssele statt wieder AAAAAAAAAAAAAAAAAAAAAA (laut vigenre tabelle) úúúúúúúúúúúú aus.



  • Ein paar Anmerkungen:
    Du benutzt die Variable spalte ohne ihr vorher einen Wert zugewiesen zu haben.

    Statt 65 darfst du auch 'A' schreiben, für 122 ebenso 'z'.
    FÜr eine Bereichsüberprüfung schau dir mal <ctype.h> an. Dort gibt es schöne Funktionen/Makros wie isalpha() oder islower() oder isupper() ...

    laete=strlen(text)-1;
                         getchar();
    
                           /* i= länge text, k= länge schlüssel */
                          for(i = 0, k = 0; i <= laete - 1; ++i, ++k) {
    

    Warum steht dat strlen()-1 ? Und warum dann nochmal i <= laete - 1?

    Und das Einrücken ist ab der for Schleife gruselig. Man muss raten wo die } hinter dem break hingehört.

    for(i = 0, k = 0; i <= laete - 1; ++i, ++k) {
                            if(k > laesch) { 
                              k = 0;
                            }
                            codiert [i] = 0;
    
                          /*codieren*/
                            if (65<=spalte<=122)
                            { spalte = (int)text[i] - 97;
                              zeile    = (int)schluessel[k] - 65;
                              codiert[i] = (char)((spalte + zeile-1)+ 65);
                            }
    
                          /*leerzeichen*/
                            if (65>=spalte>=122)            
                            { spalte = (int) text[i];
                              codiert[i] = (char) (spalte);
                            }
    
                            fflush(stdin);
                         }
    

    Und vor, nach und in der for-Schleife kannst du zu Kontrolle mal ein paar printf einbauen, damit du sieht was gerade passiert (oder nimm den Debugger)



  • So nochmal angeschaut.

    if (65<=spalte<=122)
    

    funktioniert so nicht.

    if ((65<=spalte) && (spalte <=122) )
    

    oder

    if (isalpha(spalte))
    

    Mal mit deinem aA Beispiel:

    spalte = (int)text[i] - 97;                   // 'a' - 'a' = 0;
    zeile    = (int)schluessel[k] - 65;           // 'A' - 'A' = 0;
    codiert[i] = (char)((spalte + zeile-1)+ 65);  // 0 + 0 - 1  + 65 = 64 ????
    


  • Okay, ich habe das jetzt rausgenommen, und mir ein paar ausgaben gemacht. DAbei kommt raus, dass sich k nicht mit verändert sondern immer 0 bleibt. Selbst, wenn ich manuell k=k+1 einbaue, verändert sich nichts.



  • Welchen Wert hat k?
    Welchen Wert hat laesch?



  • Jo, habs endlich rausbekommen, hatte einmal k=0 anstatt k==0 in einer bedingung stehen, jetzt klappts ordnugsgemäß und der entschlüssler funzt ebenfalls. AUf gehts zum nächsten Kapitel, arrays ein und auslesen, sowie verändern, das wird bestimmt spannend



  • Royale schrieb:

    AUf gehts zum nächsten Kapitel, arrays ein und auslesen, sowie verändern, das wird bestimmt spannend

    Hast du doch gerade eben schon gemacht 😃



  • naja, das waren strings, ich meine zweidimenionale arrays, als aufgabe im buch steht da ein labyrinth drin, ma schaun, ob ichs gebacken bekomme^^


Log in to reply