Comment crypter décrypter en Vigénere/binaire

Fermé
guig974 Messages postés 1 Date d'inscription mardi 19 mars 2019 Statut Membre Dernière intervention 19 mars 2019 - Modifié le 19 mars 2019 à 09:13
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 19 mars 2019 à 14:18
Bonjour, je suis en 1ère année d'étude en ingénierie et j'ai un projet d'informatique à terminer avant lundi. J'aurais besoin d'aide.

Alors, nous devions faire un programme permettant de crypter et décrypter une phrase de 3 façon différente. Nous avons à peu près réussi la 1ère (méthode César), mais nous avons du mal avec la deuxième partie de la 2ème (méthode Vigénére). On pensait aussi pour la troisième utiliser une méthode binaire mas nous n'y arrivons pas du tout. Merci d'avance pour votre aide.

Voici notre programme (eh oui, il n'est pas très bien "rangé" et j'ai l'impression que quelques codes sont effacés... ) :

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define ENTREE "entree.txt"

#define SORTIE "sortie.txt"

int k = 0;

int main(int argc, char *argv[])

{

    char menu;

// ON AFFICHE LE MENU PRINCIPAL...

   printf ("                                  __________________             \n\n");

   printf ("                                  **MENU PRINCIPAL**              \n");

   printf ("                                  __________________             \n\n\n");

   printf ("                            Tapez 1 pour utiliser la methode CESAR\n\n");

   printf ("                            Tapez 2 pour utiliser la methode VIGENERE \n\n");

   menu=getch();

   system("cls");

    if (menu == '1') // On affiche le premier menu puisque l'utilisateur à taper "1"

    {

    char v;

   printf ("                                   _________________             \n\n");

   printf ("                                   **METHODE CESAR**              \n");

   printf ("                                   _________________             \n\n\n");

   printf ("                            Tapez 1 pour coder une phrase manuellement\n\n");

   printf ("                            Tapez 2 pour decoder une phrase manuellement\n\n");

   printf ("                            Tapez 3 pour coder a partir d'un fichier\n\n");

   printf ("                            Tapez 4 pour decoder a partir d'un fichier\n\n");

   scanf("%d", &v);

   system("cls");

   if (v == 1)

        {

       char car ;

    char phrase[1000];

    int i;

   gets(phrase);

   printf("Entrez la phrase a coder: ");

   gets(phrase);    // Analyse la chaîne de caractères à coder

   printf("Choisissez un code entre 0 et 100: ");

   scanf("%d", &i); // Se prépare pour le code (selon le nombre de décalage de caractère proposé par l'utilisateur

   printf("le code : "); // Affiche le code

   for (k=0; k<strlen(phrase); k++)

            {

      car=(phrase[k]+ i);   // Indique le déclage de caractère dans l'ordre alphabétique

      printf("%c", car);

            }

        }

    if (v == 2)

    {

     char car ;

    char phrase[1000];

    int i;

    gets(phrase);

   printf("Entrez la phrase a decoder: ");

   gets(phrase);    // Analyse la chaîne de caractères à coder

   printf("Choisissez un code entre 0 et 100: ");

   scanf("%d", &i);     // Se prépare pour le code (selon le nombre de décalage de caractère proposé par l'utilisateur

    printf("le code : "); // Affiche le code

   for (k=0; k<strlen(phrase); k++)

{

      car=(phrase[k]- i); // Indique le déclage de caractère dans l'ordre inversement alphabétique

      printf("%c", car);

}   }

   if (v == 3)

   {

       FILE*f_in,*f_out;

       int c;

{

    FILE* fichier = NULL;

    int caractereActuel = 0;

    int i;

    char car ;

    fichier = fopen("entree.txt", "r"); // Ouvre et lis le fichier

    printf("Choisissez un code entre 0 et 100: ");

    scanf("%d", &i);    // Se prépare pour le code (selon le nombre de décalage de caractère proposé par l'utilisateur

    if (fichier != NULL)

    {

        // Boucle de lecture des caractères un à un

        printf("votre texte : ");

        do

        {

            caractereActuel = fgetc(fichier); // On lit le caractère

             // On l'affiche

            printf("%c", caractereActuel);

        } while (caractereActuel != EOF); // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)

    }

    fichier = fopen("entree.txt", "r");

      if (fichier != NULL)

    {

      printf("\nvotre texte code : ");

        do

        {

            caractereActuel = fgetc(fichier); // On lit le caractère

             // On l'affiche

            car=caractereActuel+ i;

            printf("%c", car);

        } while (caractereActuel != EOF); // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)

        fclose(fichier);

    }

    return 0;

}

}

   if (v == 4)

   {

       FILE*f_in,*f_out;

       int c;

{

    FILE* fichier = NULL;

    int caractereActuel = 0;

    int i;

    char car ;

    fichier = fopen("sortie.txt", "r"); // Ouvre et lis le fichier

    printf("Choisissez un code entre 0 et 100: ");

    scanf("%d", &i);    // Se prépare pour le code (selon le nombre de décalage de caractère proposé par l'utilisateur

    if (fichier != NULL)

    {

        // Boucle de lecture des caractères un à un

        printf("votre texte : ");

        do

        {

            caractereActuel = fgetc(fichier); // On lit le caractère

             // On l'affiche

            printf("%c", caractereActuel);

        } while (caractereActuel != EOF); // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)

    }

    fichier = fopen("sortie.txt", "r");

      if (fichier != NULL)

    {

      printf("\nvotre texte decode : ");

        do

        {

            caractereActuel = fgetc(fichier); // On lit le caractère

             // On l'affiche

            car=caractereActuel- i;

            printf("%c", car);

        } while (caractereActuel != EOF); // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)

        fclose(fichier);

    }

    return 0;

}

}

    }

 if (menu == '2')

    {

    char v;

   printf ("                                 ____________________             \n\n");

   printf ("                                 **METHODE VIGENERE**              \n");

   printf ("                                 ____________________             \n\n\n");

   printf ("                            Tapez 1 pour coder une phrase manuellement\n\n");

   printf ("                            Tapez 2 pour decoder une phrase manuellement\n\n");

   printf ("                            Tapez 3 pour coder a partir d'un fichier\n\n");

   printf ("                            Tapez 4 pour decoder a partir d'un fichier\n\n");

   scanf("%d", &v);

   system("cls");

    if (v == 1)

{

    char Cle[1000]; // Formé de caractères de 'A' à 'Z' uniquement !

char Ori[1000];

char Cry[100],Dec[100]; // Au moins aussi longs que Ori

int i=0;

gets(Ori);

printf("Entrer la phrase a coder: \n");

gets(Ori);

    gets(Cle);

    printf("entrer le code: \n");

    gets(Cle);

int nCle=strlen(Cle),nTxt=strlen(Ori);

  for (int i=0, k=-1; i<nTxt; ++i)

    {

    int c=(int)Ori[i];

    Cry[i]=((c+Cle[(++k)%nCle])%26)+26;

    }

   Cry[i]='/0';

    printf("voila la phrase crypter :  %s", Cry);

}

    if (v== 2)

        {

    char Cle[1000]; // Formé de caractères de 'A' à 'Z' uniquement !

char Ori[1000];

char Cry[100],Dec[100]; // Au moins aussi longs que Ori

int i=0;

gets(Ori);

printf("Entrer la phrase a decoder: \n");

gets(Ori);

    gets(Cle);

    printf("entrer le code: \n");

    gets(Cle);

int nCle=strlen(Cle),nTxt=strlen(Ori);

  for (int i=0, k=1; i<nTxt; ++i)

    {

    int c=(int)Ori[i];

    Cry[i]=((c+Cle[(++k)%nCle])%26)+26;

    }

   Cry[i]='/0';

    printf("voila la phrase decrypter :  %s", Cry);

}

    }

}



EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 19 mars 2019 à 14:28
Bonjour,

Votre code est mal indenté et très difficile à lire, je ne l'ai lu que superficiellement. Vous devriez adopter un style d'indentation et vous y tenir, quel qu'il soit :

https://fr.wikipedia.org/wiki/Style_d'indentation

Si vous utilisez un EDI pour programmer (ou un éditeur conçu pour la programmation), il devrait vous aider à formater correctement le code. Sauter systématiquement une ligne entre chaque ligne de code nuit à la lisibilité aussi.

Tout le programme est dans main, et avec de nombreuses répétitions. Il serait plus lisible de réfléchir à la création de fonctions, si possible réutilisables pour chiffrer et déchiffrer que la source des données vienne du clavier ou d'un fichier.

Sur le code,
gets()
n'existe plus dans le langage C depuis 2011 (de fait, chez moi, ton code ne compile pas avec gcc 6.3.0). Utilise
fgets()
avec
stdin
à la place pour demander du texte (ou un
scanf()
correctement utilisé). Si tu ne sais pas comment faire vois https://forums.commentcamarche.net/forum/affich-35909535-comprendre-l-usage-de-stdin

De plus, de façon inexplicable toutes tes demandes de saisies faites par tes
gets()
sont dupliquées avant et après les
printf()
interpellant l'utilisateur.

Une compilation avec les warnings signalera aussi une foule de problèmes, que tu ferais bien de ne pas ignorer, car même si ton programme compile, les warnings signalent dans 90% des cas des erreurs.

A titre d'exemple, gcc signale un warning lorsqu'au lieu d'utiliser le caractère de fin de chaîne (qui est
'\0'
), tu essayes d'affecter à un char
'/0'
.

Je n'ai jamais eu le plaisir de coder de chiffre de Vigenère, mais comme ton code ressemble très fortement à celui-ci https://codes-sources.commentcamarche.net/source/102446-pi-par-mr-plouffe-code-simplifie aux noms de variables près, tu peux sûrement t'en inspirer pour le mettre au point, ou simplement créer un tableau à deux dimensions avec la table de Vigenère dedans https://fr.wikipedia.org/wiki/Chiffre_de_Vigen%C3%A8re#La_table_de_Vigen%C3%A8re

Comme troisième chiffrement, tu parles de "méthode binaire", mais il n'y a aucun code correspondant dans ce que tu postes et tu n'en dis pas plus. Qu'as-tu à l'esprit en parlant de "méthode binaire" ?

Dal
1