Zum Inhalt springen

Programm mit Vigenère-Methode stürzt ab?


Empfohlene Beiträge

Geschrieben

Hallo!

Ich bin noch ein Anfänger in Sachen C/C++.

Nun sollen wir ein Programm erstellen, das mit Hilfe der Vigenère-Methode Texte verschlüsselt.

Das soll folgendermaßen funktionieren:

Bei der Vigenère-Methode werden mehrere Schlüsselalphabete verwendet, die zur Verschlüsselung eines einzelnen Klartextbuchstabens dienen. So werden im folgenden Beispiel 16 Schlüsselalphabete verwendet:

(hier: "wetter" ist das Schlüsselwort, die Buchstaben des Schlüsselworts werden 16 mal untereinander geschrieben und das Alphabet fort geführt; notfalls wird das Schlüsselwort so oft wiederholt, bis man 16 Buchstaben erhält)

a b c d e f g h i j k l m n o p q r s t u v w x y z

w x y z a b c d e f g h i j k l m n o p q r s t u v

e f g h i j k l m n o p q r s t u v w x y z a b c d

t u v w x y z a b c d e f g h i j k l m n o p q r s

t u v w x y z a b c d e f g h i j k l m n o p q r s

t u v w x y z a b c d e f g h i j k l m n o p q r s

e f g h i j k l m n o p q r s t u v w x y z a b c d

r s t u v w x y z a b c d e f g h i j k l m n o p q

a b c d e f g h i j k l m n o p q r s t u v w x y z

w x y z a b c d e f g h i j k l m n o p q r s t u v

e f g h i j k l m n o p q r s t u v w x y z a b c d

t u v w x y z a b c d e f g h i j k l m n o p q r s

t u v w x y z a b c d e f g h i j k l m n o p q r s

t u v w x y z a b c d e f g h i j k l m n o p q r s

e f g h i j k l m n o p q r s t u v w x y z a b c d

r s t u v w x y z a b c d e f g h i j k l m n o p q

w x y z a b c d e f g h i j k l m n o p q r s t u v

e f g h i j k l m n o p q r s t u v w x y z a b c d

t u v w x y z a b c d e f g h i j k l m n o p q r s

Dann codiert die Verschlüsselung den i-ten Buchstaben des Klartextes mit dem Buchstaben des i-ten Schlüsselalphabets, der dem Klartextbuchstaben zugeordnet ist.

Man erhält so z.B. zu dem Klartext "Bin heute krank" den Geheimtext "xmg lvqxx oivrd".

Nun die Aufgabenstellung:

Erstellen Sie ein Programm für die Vigenère-Methode von Texten aus Kleinbuchstaben mit 16 Verschlüsselungsalphabeten, das nach Eingabe eines Funktionscodes (1 = Verschlüsseln, 2 = Entschlüsseln, sonst = Ende), eines Schlüsselworts (max. 9 Zeichen) und eines Klartextes (max. 99 Zeichen) bzw. eines Verschlüsselungstextes den Verschlüsselungstext bzw. den Klartext ausgibt.

Mein Programm macht bisher folgendes:

- es gibt zuerst ein leeres Quadrat aus

- man gibt das Schlüsselwort ein (leider funktioniert das nur mit einem Schlüsselwort von mind. 6 Zeichen)

- dann gibt es das Quadrat mit den Buchstaben aus

- danach folgt die Eingabe des Funktionscodes (bisher konzentriere ich mich aufs Verschlüsseln - also Funktionscode = 1)

- dann gibt es "Verschluesseln" aus

- man gibt den Klartext ein (bisher noch ohne weitere Bearbeitung)

- dann gibt es nochmals "Verschluesseln" aus (zur Kontrolle, dass das Programm in die Funktion "verschluesseln" geht)

- eigentlich sollte die entsprechende Funktion dann die Länge des Klartextes ausgeben (zur Kontrolle) und den Verschlüsselungstext zurückgeben

Aber es stürzt dort jedes mal ab! :confused:

Also der Code sieht folgendermaßen aus:




#include <stdio.h>

#include <math.h>

#include <string.h>

#include <stdlib.h>


char feld[19][26];         // mein Buchstabenfeld

int i,j;                        // Zeile, Spalte des Feldes


int main()

{

    int code;                  // Funktionscode

                                  // Funktion für Verschluesselung

    char verschluesseln(char *schluesselwort, char *klartext);

    char schluesselwort[256], klartext[100], verschluesselungstext[100];

    char entschluesseln(char *schluesselwort, char *verschluesselungstext);

    char ergebnis[100];      // Verschluesselungstext bzw. Klartext

    int ok;

    char eingabe_schluesselwort();

    char eingabe_code();

    char eingabe_verschluesselungstext();

    char eingabe_klartext();

    int feld_beschreiben(char *schluesselwort);


// Alphabet darstellen

int x = 97;             // Asci-Code --> "a"

                        // Schleife fuer Spalten, X-Achse

	for(j=0; j<25; j++)

	{

	    feld[0][j] = x;

		printf("%c ", feld[0][j]);

		x++;

	}

	printf("\n");



// Inhalte des Feldes loeschen


                            // Schleife fuer Zeilen, Y-Achse

for(i=0; i<18; i++)

{                           // Schleife fuer Spalten, X-Achse

	for(j=0; j<=24; j++)

	{

		feld[i][j] = '0';

		printf("%c ", feld[i][j]);

	}

	printf("\n");

}


ok = feld_beschreiben(schluesselwort);


code = eingabe_code();


if (code == 1)

{

    printf("Verschluesseln \n");


    klartext[100] = eingabe_klartext();


    ergebnis[100] = verschluesseln(*schluesselwort, klartext[100]);

    printf("Ergebnis = %c", ergebnis);


}

else if (code == 2)

{

    printf("Entschluesseln");

}

else

{

    printf("Ungueltige Eingabe");

}



    return 0;

}



char eingabe_code()

{

    int code;

    printf("Funktionscode eingeben: ");

    scanf("%i",&code);

    fflush(stdin);

    return code;

}



char eingabe_klartext()      // In dieser Funktion bin ich mir nicht ganz sicher

{                                   // ob sie richtig ist

    char klartext[100];


    printf("Klartext eingeben: ");

    fgets(klartext, 100, stdin);


    klartext[100] = malloc(strlen(klartext)+1);

    fflush(stdin);

    return klartext[100];

}



char eingabe_verschluesselungstext()

{

    char verschluesselungstext[100];

    printf("Verschluesselungstext eingeben: ");

    gets(verschluesselungstext);

    fflush(stdin);

    return *verschluesselungstext;

}



char verschluesseln(char schluesselwort[256], char klartext[100])

{

    char ergebnis[100];

    printf("Verschluesseln \n");

                  [COLOR="Red"]// ab hier hängt sich das Programm auf![/COLOR]


    //Zaehlende Schleife:


    int x;                          // x-ter Buchstabe des klartextes


    unsigned strlen(klartext);

    unsigned y;


    y = strlen(klartext);       // Laenge des klartextes

    printf("Laenge des Klartextes: %i", y);


    for (x = 0; x < y; x++)

    {


        //Buchstaben vergleichen:


        while (klartext[x] != feld[i][0])

        {

            i++;

        }


        //wenn Buchstaben gleich sind:


        if (klartext[x] == feld[i][0])

        {

            ergebnis[x] = feld[i][1];

        }

    }

    printf("Ergebnis = %c%c%c", ergebnis[0], ergebnis[1], ergebnis[2]);


    return *ergebnis;

}



char entschluesseln(char *schluesselwort, char *verschluesselungstext)

{

    printf("Entschluesseln");

    return 0;

}



int feld_beschreiben(char *schluesselwort)

{

    int ok, i = 0;                  //Spalte

    static int j = 0;               //Zeile

    char feld[19][26];

    static int laenge = 0;          //Laenge des Schluesselworts

    int h;                          //Zaehler wenn laenge kleiner 16


    printf ("Schluesselwort mit mindestens 6 Zeichen: ");

    gets (schluesselwort);


    laenge = strlen(schluesselwort);    //Laenge des Schluesselworts bestimmen

    printf ("Das Schluesselwort ist %u Characters lang.\n \n", laenge);



// Schluesselwort hinschreiben


    if (laenge == 16)              //Wenn die Laenge von schluesselwort maximal ist,

    {                                   //schluesselwort ins Feld uebertragen

        for(i=0; i<18; i++)

        {

            feld[i][0] = schluesselwort[i-2];

        }

    }

    else if (laenge >= 10)         //Wenn schluesselwort zu lang ist,

    {                                   //abbrechen

        printf("Bitte ein Schluesselwort mit maximal 9 Zeichen eingeben!\n");

        return 0;

    }

    else                                //Wenn schluesselwort zu kurz ist

    {


        for (i=0; i<laenge+2; i++)      //schluesselwort einmal hinschreiben

            {

                feld[i][0] = schluesselwort[i-2];

            }

        i = laenge+2;

        h = laenge;


        while(h<(2*laenge+1))           // Solange max i nicht erreicht ist

        {                                       // schluesselwort wiederholen

            feld[i][0] = schluesselwort[i-(laenge+2)];

            i++;

            h++;

            printf("h = %i \n", h);

        }

        i--;

        if ((h = (2*laenge+1)) && (laenge*2 < 16))  // Wenn i immer noch nicht erreicht ist

        {

            while (h < 18)

            {                                       // schluesselwort nochmals wiederholen

                feld[i][0] = schluesselwort[i-2*(laenge)-2];

                i++;

                h++;

                printf("h = %i \n", h);

            }

        }

    }


// Alphabet darstellen

int x = 97;

                        // Schleife fuer Spalten, X-Achse

	for(j=0; j<26; j++)

	{

	    feld[0][j] = x;

		printf("%c ", feld[0][j]);

		x++;

	}

	printf("\n");



// Inhalte des Feldes darstellen

                        // Schleife fuer Zeilen, Y-Achse

for(i=2; i<18; i++)

{                       // Schleife fuer Spalten, X-Achse

	for(j=0; j<26; j++)

	{

	    if (i>1 && j>0)

	    {

            feld[i][j] = feld[i][j-1] + 1;

            if (feld[i][j] > 122)

            {

                feld[i][j] = feld[i][j-1] - 25;

            }

	    }

	    else

	    {

	        feld[i][j] = feld[i][j];

	    }

		printf("%c ", feld[i][j]);

	}

	printf("\n");

}


ok = 1;

return ok;

}


Ich wäre euch sehr dankbar, wenn ihr mir sagen könntet, wo der Fehler ist.

LG Anel

Geschrieben

Du hast ein grundsätzliches Verständnisproblem bei der Verwendung von Arrays.

Wenn du ein Array als char klartext[100] deklarierst, was ist dann klartext[0]? Beantworte das für dich selbst, bevor du weiterliest.

Antwort: klartext[0] bezeichnet das erste Element des Array klartext.

Was ist klartext[99]?

Antwort: klartext[99] bezeichnet das 100. (und damit letzte) Element des Arrays klartext.

Was ist klartext[100]?

Antwort: klartext[100] wäre das 101. Element des Arrays klartext. Da dieses aber nur 100 Elemente hat, ist der Ausdruck ungültig.

Du tust in deinem Code allerdings mehrfach so, als würde so ein Ausdruck plötzlich das ganze Array bezeichnen.

Mit klartext[100] = irgendwas machst du keine Zuweisung an das ganze Array, genausowenig wie mit klartext[0] oder klartext[99]. Damit greifst du nur auf ein ungültiges Element zu.

Man kann Arrays nichts zuweisen. Du musst die Elemente einzeln kopieren. Bei nullterminierten Strings kannst du strcpy benutzen.

Geschrieben

Ja, da hast du vollkommen recht, ich bin total verwirrt mit diesen Arrays, Zeigern, Reihungen, Feldern,... :confused:

D.h. ich muss bei der deklaration anstatt klartext[100] klartext[99] schreiben und auch bei den anderen arrays dasselbe machen (also jedes mal dieses Nullzeichen nicht mit einbeziehen)... ok, das versteh ich noch aber was mache ich, wenn ich auf den gesamten array zugreifen will?

Muss ich dann jedes mal eine zählende Schleife durchführen oder geht das dann mit Zeigern...? :confused:

Geschrieben
D.h. ich muss bei der deklaration anstatt klartext[100] klartext[99] schreiben und auch bei den anderen arrays dasselbe machen (also jedes mal dieses Nullzeichen nicht mit einbeziehen)
Nein. Ich habe jetzt im Detail nicht geprüft, ob deine Arrays groß genug sind, aber ich meinte nicht, dass du sie kleiner machen sollst.

aber was mache ich, wenn ich auf den gesamten array zugreifen will?

Muss ich dann jedes mal eine zählende Schleife durchführen oder geht das dann mit Zeigern...? :confused:

Wie ich bereits sagte:

Du musst die Elemente einzeln kopieren. Bei nullterminierten Strings kannst du strcpy benutzen.

char-Array mit Nullterminierung -> strcpy

Alles andere -> memcpy oder eine Schleife

Geschrieben

Ich habs! :D

Ich weiß nicht, ob das umständlich ist oder so, aber es funktioniert! :D

Also ich hab das jetzt folgendermaßen gemacht:

(Ich hab u.a. die maximalen Werte als Konstanten deklariert, dass man nicht durcheinander kommt und ein paar Funktionen in die main-Funktion gepackt)


#include <stdio.h>

#include <math.h>

#include <string.h>

#include <stdlib.h>


#define MI  18          // maximales i, maximales j

#define MJ  26

#define MT  99          // maximaler Text

#define MW  9           // maximales Wort


    char feld[MI][MJ];

    int i,j;            // Zeile, Spalte des Feldes

    char schluesselwort[MW], klartext[MT], verschluesselungstext[MT];

    char *p;            // Zeiger der auf das Feld zeigt


int main()

{

    int code;                  //Funktionscode

    char ergebnis[MT] = {0};

    char eingabe_code();

    char feld_beschreiben();



// Alphabet darstellen

int x = 97;             // Asci-Code --> "a"

                        // Schleife fuer Spalten, X-Achse

	for(j=0; j<25; j++)

	{

	    feld[0][j] = x;

		printf("%c ", feld[0][j]);

		x++;

	}

	printf("\n");



// Inhalte des Feldes loeschen

                            // Schleife fuer Zeilen, Y-Achse

for(i=0; i<16; i++)

{                           // Schleife fuer Spalten, X-Achse

	for(j=0; j<=24; j++)

	{

		feld[i][j] = '0';

		printf("%c ", feld[i][j]);

	}

	printf("\n");

}



p = feld_beschreiben();



code = eingabe_code();


if (code == 1)

{

    int k;                  // Anzahl der Buchstaben des Klartextes


    printf("Verschluesseln \n");

    printf("Wieviele Buchstaben hat der Klartext? ");

    scanf("%i", &k);


    for (i = 2; i <= k+1; i++)

    {

        j = 0;

        printf("%d. Buchstabe des Klartextes eingeben: ", i-1);

        fflush(stdin);

        scanf("%c", &klartext[i-1]);


        if ((klartext[i-1] >= 'a') && (klartext[i-1] <= 'z'))

        {

            while (klartext[i-1] != feld[0][j])

            {

                j++;

            }

            ergebnis[i-2] = feld[i][j];

        }

        else

        {

            ergebnis[i] = klartext[i];

        }

    }


    printf("Loesung: ");


    for (i = 0; i < k; i++)

    {

        printf("%c", ergebnis[i]);

    }

    printf("\n");


}


else if (code == 2)

{

    printf("Entschluesseln \n");


    int v;                  // Anzahl der Buchstaben des Verschlüsselungstextes


    printf("Wieviele Buchstaben hat der Verschluesselungstext? ");

    scanf("%i", &v);


    for (i = 2; i <= v+1; i++)

    {

        j = 0;

        printf("%d. Buchstabe des Verschluesselungstextes eingeben: ", i-1);

        fflush(stdin);

        scanf("%c", &verschluesselungstext[i-2]);


        if ((verschluesselungstext[i-2] >= 'a') && (verschluesselungstext[i-2] <= 'z'))

        {

            while (verschluesselungstext[i-2] != feld[i][j])

            {

                j++;

            }

            ergebnis[i-2] = feld[0][j];

        }

        else

        {

            ergebnis[i] = verschluesselungstext[i];

        }

    }


    printf("Loesung: ");


    for (i = 0; i < v; i++)

    {

        printf("%c", ergebnis[i]);

    }

    printf("\n");


}


else

{

    printf("Ungueltige Eingabe");

}



    return 0;

}


char eingabe_code()

{

    int code;

    printf("Funktionscode eingeben: ");

    scanf("%i",&code);

    fflush(stdin);

    return code;

}


char feld_beschreiben()

{

    int i = 0;                      //Spalte

    static int j = 0;               //Zeile

    static int laenge = 0;          //Laenge des Schluesselworts

    int h;                          //Zaehler wenn laenge kleiner 16


    printf ("Schluesselwort mit mindestens 6 Zeichen: ");

    gets (schluesselwort);


    laenge = strlen(schluesselwort);    //Laenge des Schluesselworts bestimmen

    printf ("Das Schluesselwort ist %u Characters lang.\n \n", laenge);


// Schluesselwort hinschreiben


    if (laenge == 16)                   //Wenn die Laenge von schluesselwort maximal ist,

    {                                   //schluesselwort ins Feld uebertragen

        for(i=0; i<18; i++)

        {

            feld[i][0] = schluesselwort[i-2];

        }

    }

    else if (laenge >= 10)               //Wenn schluesselwort zu lang ist,

    {                                   //abbrechen

        printf("Bitte ein Schluesselwort mit maximal 9 Zeichen eingeben!\n");

        return 0;

    }

    else                                //Wenn schluesselwort zu kurz ist

    {


        for (i=0; i<laenge+2; i++)      //schluesselwort einmal hinschreiben

            {

                feld[i][0] = schluesselwort[i-2];

            }

        i = laenge+2;

        h = laenge;


        while(h<(2*laenge+1))           // Solange max i nicht erreicht ist

        {                               // schluesselwort wiederholen

            feld[i][0] = schluesselwort[i-(laenge+2)];

            i++;

            h++;

            //printf("h = %i \n", h);

        }

        i--;

        if ((h = (2*laenge+1)) && (laenge*2 < 16))  // Wenn i immer noch nicht erreicht ist

        {

            while (h < 18)

            {                                       // schluesselwort nochmals wiederholen

                feld[i][0] = schluesselwort[i-2*(laenge)-2];

                i++;

                h++;

                //printf("h = %i \n", h);

            }

        }

    }


// Alphabet darstellen

char x = 'a';

                        // Schleife fuer Spalten, X-Achse

	for(j=0; j<26; j++)

	{

	    feld[0][j] = x;

		printf("%c ", feld[0][j]);

		x++;

	}

	printf("\n");



// Inhalte des Feldes darstellen

                        // Schleife fuer Zeilen, Y-Achse

for(i=2; i<18; i++)

{                       // Schleife fuer Spalten, X-Achse

	for(j=0; j<26; j++)

	{

	    if (i>1 && j>0)

	    {

            feld[i][j] = feld[i][j-1] + 1;

            if (feld[i][j] > 'z')

            {

                feld[i][j] = feld[i][j-1] - 25;

            }

	    }

	    else

	    {

	        feld[i][j] = feld[i][j];

	    }

		printf("%c ", feld[i][j]);

	}

	printf("\n");

}


p = &feld[i][j];


return p;

}


Vielen Dank für deine Hilfe!

P.S.: Ich hab eine Seite gefunden, auf der die Arrays und auch andere Sachen sehr schön erklärt sind:

Galileo Computing :: C von A bis Z

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...