Comment crypter décrypter en Vigénere/binaire
guig974
Messages postés
1
Date d'inscription
Statut
Membre
Dernière intervention
-
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
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... ) :
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. |
A voir également:
- Comment crypter décrypter en Vigénere/binaire
- Dvd decrypter - Télécharger - Copie & Extraction
- Binaire - Guide
- Comment decrypter une chaine cryptée - Forum Box et Streaming vidéo
- Question binaire - Forum Bases de données
- Logiciel pour décrypter un fichier crypté - Télécharger - Chiffrement
1 réponse
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,
De plus, de façon inexplicable toutes tes demandes de saisies faites par tes
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
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
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