From e394f4a01ed75764810c4b0155865e5dd8b0516e Mon Sep 17 00:00:00 2001 From: toussain Date: Fri, 16 Dec 2022 16:59:35 +0100 Subject: [PATCH] Version finale --- prgm/Makefile | 6 +- prgm/cle.txt | 2 +- prgm/codage.c | 33 ++++++---- prgm/code.c | 51 +++++++++------ prgm/decodage.c | 28 ++++++--- prgm/generate.c | 34 ++++++---- prgm/main.c | 148 -------------------------------------------- prgm/message.txt | 2 +- prgm/message_c.txt | 1 - prgm/message_dc.txt | 1 - prgm/run | Bin 21208 -> 0 bytes 11 files changed, 101 insertions(+), 205 deletions(-) delete mode 100644 prgm/main.c delete mode 100644 prgm/message_c.txt delete mode 100644 prgm/message_dc.txt delete mode 100755 prgm/run diff --git a/prgm/Makefile b/prgm/Makefile index 5abdd7a..029618f 100644 --- a/prgm/Makefile +++ b/prgm/Makefile @@ -1,5 +1,5 @@ -run : codage.o decodage.o code.o generate.o - gcc -o run codage.o decodage.o code.o generate.o +code : codage.o decodage.o code.o generate.o + gcc -o code codage.o decodage.o code.o generate.o codage.o : codage.c gcc -o codage.o -c codage.c @@ -14,4 +14,4 @@ generate.o : generate.c gcc -o generate.o -c generate.c clean : - rm -f *.o + rm -f *.o -f code diff --git a/prgm/cle.txt b/prgm/cle.txt index 70db91d..0831df4 100644 --- a/prgm/cle.txt +++ b/prgm/cle.txt @@ -1 +1 @@ -ixbvhdkevteiludzxvpsnpcp \ No newline at end of file +ewdxtsjgwhkpybfnthzfibqx \ No newline at end of file diff --git a/prgm/codage.c b/prgm/codage.c index 8c4cbf9..8bf604c 100644 --- a/prgm/codage.c +++ b/prgm/codage.c @@ -3,13 +3,6 @@ On ecrit un programme qui à partir d'un fichier message et d'un fichier clé produira un fichier message_code */ - -/* - 1. La méthode la plus simple les noms de fichiers sont connus - 2. On demande le nom des fichiers à l'utilisateur - 3. Les noms de fichiers sont passés en paramètres sur le ligne de commande -*/ - #include #include @@ -24,17 +17,31 @@ int codage(int argc, char *argv[]) { int k1; int calcul; + // Ouverture des fichiers et vérification d'erreurs d'ouverture + char * cheminFic_m = argv[2]; f_m = fopen(cheminFic_m, "r"); - /* Traitement erreur */ - char * cheminFic_k = argv[3]; + if (f_m==NULL) + { + printf("Echec de l'ouverture du fichier.\n"); + } + + char * cheminFic_k = argv[3]; f_k = fopen(cheminFic_k, "r"); - /* Traitement erreur */ + if (f_k==NULL) + { + printf("Echec de l'ouverture du fichier.\n"); + } + char * cheminFic_mc = argv[4]; f_mc = fopen(cheminFic_mc, "w"); - /* Traitement erreur */ - + if (f_mc==NULL) + { + printf("Echec de l'ouverture du fichier.\n"); + } + // Boucle : calcul permettant de coder un caractère puis l'écrire dans le + // fichier f_m while ((c = fgetc(f_m)) != EOF) { k1 = fgetc(f_k); @@ -42,7 +49,7 @@ int codage(int argc, char *argv[]) { fputc(calcul, f_mc); } - + // Fermeture des fichiers fclose(f_m); fclose(f_k); fclose(f_mc); diff --git a/prgm/code.c b/prgm/code.c index be0146b..05af986 100644 --- a/prgm/code.c +++ b/prgm/code.c @@ -1,40 +1,53 @@ #include #include +#include #include "fonctions.h" int main(int argc, char *argv[]) { FILE *f_m, *f_k, *f_mc; /* strcutures permettant, une fois FOPEN exécuté de recupérer des informations pour manipuler les fichiers en C */ - int c, count=0; char * cheminFic_m = argv[2]; + int c,count=0; - f_m = fopen(cheminFic_m, "r"); - if(f_m==NULL) - { - return EXIT_FAILURE; - } - for (c = getc(f_m); c != EOF; c = getc(f_m)) - { - count = count + 1; - } - generate(count, argc, argv); - //fclose(f_m); + + /* recupération sur la ligne de commande des noms de fichiers et option (-c pour + codage, -d pour décodage) : message cle message_calculé - /* recupération sur la ligne de commande des noms de fichiers et option (-c pour codage - -d pour décodage : message cle message_calculé - - code -c f1 f2 f3 - code -d f1 f2 f3 + ./code -c f1 f2 f3 + ./code -d f1 f2 f3 */ - if(argv[1]=="-c") + + // Si l'option donnée en premier argument est "-c", alors on génère une clé + // aléatoirement et on code le message avec + if(strcmp(argv[1], "-c")==0) { + // Parcours le fichier du message à coder pour connaitre le nombre de caractères présents. + f_m = fopen(cheminFic_m, "r"); + if(f_m==NULL) + { + return EXIT_FAILURE; + } + for (c = getc(f_m); c != EOF; c = getc(f_m)) + { + count = count + 1; + } + + // Génère une clé aléatoire + generate(count, argc, argv); + + // Code le message codage(argc, argv); } - else if(argv[1]=="-d") + /* Si l'option donée en premier argument est "-d", alors on décode le message + donné en 2eme argument en mettant le résultat dans un nouveau fichier nommé + en 4eme argument + */ + else if(strcmp(argv[1], "-d")==0) { + // Décode le message codé decodage(argc, argv); } return EXIT_SUCCESS; diff --git a/prgm/decodage.c b/prgm/decodage.c index 7eb80be..fa34e23 100644 --- a/prgm/decodage.c +++ b/prgm/decodage.c @@ -1,3 +1,9 @@ +/* + Decodage du message + On ecrit un programme qui à partir d'un fichier message_code et + d'un fichier clé produira un fichier message_decode +*/ + #include #include @@ -9,24 +15,32 @@ int decodage(int argc, char *argv[]) { int k1; int calcul; + // Ouverture des fichiers et vérification d'erreurs d'ouverture + char * cheminFic_m = argv[2]; f_m = fopen(cheminFic_m, "r"); - if (f_m==NULL){ - printf("L'ouverture du fichier à échouer. Veuillez verifier l'existence de celui-ci.\n"); + if (f_m==NULL) + { + printf("Echec de l'ouverture du fichier.\n"); } char * cheminFic_k = argv[3]; f_k = fopen(cheminFic_k, "r"); - if (f_k==NULL){ - printf("L'ouverture du fichier à échouer. Veuillez verifier l'existence de celui-ci.\n"); + if (f_k==NULL) + { + printf("Echec de l'ouverture du fichier.\n"); } char * cheminFic_mdc = argv[4]; f_mdc = fopen(cheminFic_mdc, "w"); - if (f_mdc==NULL){ - printf("L'ouverture du fichier à échouer. Veuillez verifier l'existence de celui-ci.\n"); + if (f_mdc==NULL) + { + printf("Echec de l'ouverture du fichier.\n"); } + + // Boucle : calcul permettant de decoder un caractère puis l'écrire dans le + // fichier f_mdc while ((c = fgetc(f_m)) != EOF) { k1 = fgetc(f_k); @@ -34,7 +48,7 @@ int decodage(int argc, char *argv[]) { fputc(calcul, f_mdc); } - /*fermeture des fichiers*/ + //fermeture des fichiers fclose(f_m); fclose(f_k); fclose(f_mdc); diff --git a/prgm/generate.c b/prgm/generate.c index 34ee6e3..657e9d5 100644 --- a/prgm/generate.c +++ b/prgm/generate.c @@ -4,7 +4,9 @@ #include #include "fonctions.h" -int generate(int count,int argc,char *argv[]) + + +int generate(int count, int argc,char *argv[]) { FILE *f; char cle[count]; @@ -12,20 +14,30 @@ int generate(int count,int argc,char *argv[]) char characteres[26]="azertyuiopqsdfghjklmwxcvbn"; srand(time(NULL)); - for(a=0;a<(count-2);a++) { /*on fait donc une première boucle*/ + + //Crée la nouvelle clé à partir du nombre de caractères du message + for(a=0;a<(count-2);a++) + { i = rand()%26; cle[a]=characteres[i]; - } - for (a=1;a<3;a++){ + } + + for (a=1;a<3;a++) + { i = rand()%26; cle[count-a]=characteres[i]; - } + } f = fopen (argv[3], "w"); - if (f) { - fwrite (cle, sizeof(char), count, f); - } else { - return EXIT_FAILURE; - } - fclose (f); + + //Ecris la clé précédemmant créée dans le fichier cle.txt par exemple + if (f) + { + fwrite (cle, sizeof(char), count, f); + } + else + { + return EXIT_FAILURE; + } + fclose (f); return EXIT_SUCCESS; } \ No newline at end of file diff --git a/prgm/main.c b/prgm/main.c deleted file mode 100644 index 74425bb..0000000 --- a/prgm/main.c +++ /dev/null @@ -1,148 +0,0 @@ -#include -#include -#include -#include - -int decodage(int argc, char *argv[]) { - FILE *f_m, *f_k, *f_mdc; /* strcutures permettant, une fois FOPEN - exécuté de recupérer des informations pour manipuler les fichiers - en C */ - int c; - int k1; - int calcul; - - char * cheminFic_m = "message.txt"; - f_m = fopen(cheminFic_m, "r"); - if (f_m==NULL){ - printf("L'ouverture du fichier à échouer. Veuillez verifier l'existence de celui-ci.\n"); - } - - char * cheminFic_k = "cle.txt"; - f_k = fopen(cheminFic_k, "r"); - if (f_k==NULL){ - printf("L'ouverture du fichier à échouer. Veuillez verifier l'existence de celui-ci.\n"); - } - - char * cheminFic_mdc = "message_dc.txt"; - f_mdc = fopen(cheminFic_mdc, "w"); - if (f_mdc==NULL){ - printf("L'ouverture du fichier à échouer. Veuillez verifier l'existence de celui-ci.\n"); - } - - while ((c = fgetc(f_m)) != EOF) - /* EOF est une constante obligatoirement - négative (elle vaut -1 sous Linux). */ - { - k1 = fgetc(f_k); /* fgetc lis le caractère à la position courante du flux considéré*/ - calcul = c-k1 >= 0?c-k1:256-(c-k1); /* ?? */ - fputc(calcul, f_mdc); - } - - /*fermeture des fichiers*/ - fclose(f_m); - fclose(f_k); - fclose(f_mdc); - - return EXIT_SUCCESS; - -} - - -int codage(int argc, char *argv[]) { - FILE *f_m, *f_k, *f_mc; /* strcutures permettant, une fois FOPEN - exécuté de recupérer des informations pour manipuler les fichiers - en C */ - int c; - int k1; - int calcul; - - char * cheminFic_m = "message.txt"; - f_m = fopen(cheminFic_m, "r"); - if (f_m==NULL){ - printf("L'ouverture du fichier à échouer. Veuillez verifier l'existence de celui-ci.\n"); - } - - char * cheminFic_k = "cle.txt"; - f_k = fopen(cheminFic_k, "r"); - if (f_k==NULL){ - printf("L'ouverture du fichier à échouer. Veuillez verifier l'existence de celui-ci.\n"); - } - - char * cheminFic_mc = "message_c.txt"; - f_mc = fopen(cheminFic_mc, "w"); - if (f_mc==NULL){ - printf("L'ouverture du fichier à échouer. Veuillez verifier l'existence de celui-ci.\n"); - } - - - while ((c = fgetc(f_m)) != EOF) - /* EOF est une constante qui est obligatoirement - négative (elle vaut -1 sous Linux). */ - { - k1 = fgetc(f_k); - calcul = (c+k1) % 256; /* modulo 256 du caractère qui est entrain d'être lu */ - fputc(calcul, f_mc); /* fputc permet d'écrire un caractère sur le flux de caractères passé en paramètre*/ - } - - - fclose(f_m); - fclose(f_k); - fclose(f_mc); - - return EXIT_SUCCESS; - -} - -int main(int argc, char *argv[]) { - FILE* fp, *fichier; /* strcutures permettant, une fois FOPEN exécuté de recupérer des informations pour manipuler les fichiers en C */ - int c, nbrchar; - char cle[nbrchar]; - int a,place; - char characteres[26]="abcdefghijklmnopqrstuvwxyz"; - srand(time(NULL)); - - fp = fopen("message.txt", "r"); /*ouvre le fichier*/ - if (!fp) { - printf("Could not open file \n"); /*renvoie une erreur si le nom du fichier est incorrect*/ - return 0; - } - - for (c = getc(fp); c != EOF; c = getc(fp)){ /*extrait les caractères du fichiers*/ - // Increment un caractère dans le compteur - nbrchar = nbrchar + 1; - } - - // Close the file - fclose(fp); - - /* !! ATTENTION nbrchar compte 2 caractères de plus que le nombre de caractère visible */ - - for(a=0;a<(nbrchar-2);a++) { /*on fait donc une première boucle*/ - place = rand()%26; - cle[a]=characteres[place]; - } - - for (a=1;a<3;a++){ - place = rand()%26; - cle[nbrchar-a]=characteres[place]; - } - - fichier = fopen ("cle.txt", "wb"); - if (fichier) { - fwrite (cle, sizeof(char), nbrchar, fichier); - } else { - return EXIT_FAILURE; - } - fclose (fichier); - - if (argv[1]=="-c"){ - codage(argc, argv); - } - - else if (argv[1]=="-d"){ - decodage(argc, argv); - } - - - return EXIT_SUCCESS; -} \ No newline at end of file diff --git a/prgm/message.txt b/prgm/message.txt index 139bf2d..91aab4a 100644 --- a/prgm/message.txt +++ b/prgm/message.txt @@ -1 +1 @@ -txt a encoder stp marche \ No newline at end of file +txt a encoder \ No newline at end of file diff --git a/prgm/message_c.txt b/prgm/message_c.txt deleted file mode 100644 index 9ca4fe5..0000000 --- a/prgm/message_c.txt +++ /dev/null @@ -1 +0,0 @@ -֐ϋփ \ No newline at end of file diff --git a/prgm/message_dc.txt b/prgm/message_dc.txt deleted file mode 100644 index 3569017..0000000 --- a/prgm/message_dc.txt +++ /dev/null @@ -1 +0,0 @@ -txt a encoder stp marche non \ No newline at end of file diff --git a/prgm/run b/prgm/run deleted file mode 100755 index d40cb687711075b10ba9afa8db26b0824250da2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21208 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