Il y a actuellement 199 visiteurs
Jeudi 18 Avril 2024
accueilactualitésdossierscomparer les prixtélécharger gratuitement vos logicielsoffres d'emploiforum informatique
Connexion
Créer un compte

Projet Cryptographie: Programme en C

Besoin d'aide pour configurer un serveur ? Vous souhaitez obtenir des conseils pour référencer votre site ? Un petit souci pour accéder à votre FTP ? Des soucis de programmation en PHP / ASP / HTML / XHTML / XML / XSLT / CSS / ReactJS / AngularJS / VueJS / CGI / PERL / C / MySQL / PostgreSQL ??? Nous avons peut-être la solution dans ce forum ...

Projet Cryptographie: Programme en C

Message le 29 Nov 2014 21:25

Bonsoir à tous,
je reviens une nouvelle fois vers vous, car j'ai désespérément besoin de votre aide, en effet j'ai un projet à rendre avant la fin du mois et qui consiste à écrire un programme en C qui crypte un message selon 3 méthodes, c'est à l'utilisateur de choisir la méthode du cryptage qu'il veut lors de l'exécution du programme. Alors j'ai à écrire les programmes qui font les codages suivants:
1. Le codage par substitution (codes à décalage fixe) de Jules César
2. Le codage par substitution (code de Vigenère)
3. Le codage par pliage.

J'ai donc commencé à écrire le programme qui fait le premier codage je vous laisse lire le principe (l'énoncé):

- Énoncé:
L'origine de ce type de codage est attribué à Jules César qui proposa de coder les messages par un décalage fixe de 3 positions de l'ensemble des lettres du message. Ainsi, A devient D, B devient E etc... Plus généralement, on substitue à chaque lettre du message, une lettre obtenue en effectuant une translation fixe connue d'avance de k positions vers la droite. Rédigez un programme en C effectuant le codage d'un message à partir d'une chaîne de caractères et d'une valeur de k demandée à l'utilisateur (k étant ce qu'on appelle la clé du codage ou le décalage). L'alphabet étant uniquement constitué des 26 lettres majuscules (de A à Z) vous effectuerez un contrôle du message avant le codage en supprimant les lettres n'appartenant pas à l'alphabet imposé.

-Problème:
J'ai écris le programme comme demandé, et il s'exécute sans faute lorsque l'utilisateur tape un message en majuscule il fait le décalage normalement. Seulement quand l'utilisateur tape un message avec des chiffres ou des minuscules ou des symboles là ça se complique, il ne s'exécute pas correctement, pourtant je ne sais pas je pense avoir correctement écris la partie qui permet de faire le contrôle et donc de supprimer ce qui n'appartient pas à l'alphabet imposé. Je vous laisse analyser ou exécuter mon code:

Code: Tout sélectionner
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void CESARcrypto (int cle, char *message)
{
    int i=0,j,n=strlen(message);
   
    /*CONTROLE: Si le caractere est une minuscule, un chiffre ou un symbole on le supprime*/

    while(i<n)
    {    if ((message[i]<'A') || (message[i]>'Z'))
                  for(j=i;j<n-1;j++)
                  {
                                message[j]=message[j+1];
                                n--;
                  }
          else i++;           
    }
    message[n]='\0';
    printf("Message a crypter: %s\n\n",message);


   /*  Explication de la méthode de cryptage utilisée:
        message[i] - 'A' ---> on récupère un nombre représentant le caractère contenu dans message[i] (0=A, 1=B, ...)
        (message[i] - 'A') + cle ---> on lui applique le décalage.
        ((message[i] - 'A') + cle)%26 ---> on fait modulo 26 pour revenir au début si on a dépassé 'Z'.
         'A' + ((message[i] - 'A') + cle)%26 ---> on retrouve le bon caractère en ajoutant 'A'.
    */


    /*On effectue le décalage*/
    for(i=0;i<n;i++)
    {
               
                message[i]='A'+((message[i] - 'A')+cle)%26;
    }
}
 
main()
{
      int k;
      char * message;
 
    printf("CRYPTAGE PAR SUBSTITUTION SELON JULES CESAR:\n\n");
   
    printf("Donner le message a crypter:\n");
    scanf("%s",message);
    printf("Donner la cle du cryptage:\n");
    scanf("%d",&k);
       
    CESARcrypto(k,message);
   
    printf("Message crypte: %s\n\n",message);
 
    system("pause");
}



Alors voilà ça fait des heures que je bosse dessus et je ne sais vraiment pas ou est le problème. J'espérais trouver de l'aide parmi vous. Aussi, d'autres propositions en ce qui concerne le décalage en lui même (je vous rappelle
le mien: message[i]='A'+((message[i] - 'A')+cle)%26;) sont les bienvenues, proposez vos idées peut-être sont elles meilleures que la mienne. Merci infiniment à tous ceux qui s'attarderont là dessus je vous serai infiniment reconnaissante de votre aide.
Passez une bonne soirée =)
Avatar de l'utilisateur
POPPY ♥
Visiteur Confirmé
Visiteur Confirmé
 
Messages: 13
Inscription: 24 Sep 2014 18:25
 


Re: Projet Cryptographie: Programme en C

Message le 29 Nov 2014 23:18

Salut :)

Ca fait un bout de temps que j'ai pas touché au C mais je regarderai demain ;)
Avatar de l'utilisateur
JulesR2
PC-Infopraticien
PC-Infopraticien
 
Messages: 5391
Inscription: 25 Avr 2014 15:32
Localisation: La Haye
 

Re: Projet Cryptographie: Programme en C

Message le 01 Déc 2014 10:51

Perso je ne tente pas trop de comprendre ton code (car ça me parait un peu alambiqué) mais là il y a clairement un soucis :
Code: Tout sélectionner
 if ((message[i]<'A') || (message[i]>'Z'))
           for(j=i;j<n-1;j++)
            {
                  message[j]=message[j+1];
                   n--;
             }

La première entrée dans la boucle écrase le caractère message[0]... et tu le perds définitivement.
Puis je comprend pas le n-- :roll: car tu fais varier dans ton for un élément de test (j<n-1). C'est pas clair tout ça...
Avatar de l'utilisateur
CaSa
PC-Infopraticien
PC-Infopraticien
 
Messages: 9040
Inscription: 13 Mai 2003 16:32
Localisation: Sisteron... et jamais loin d'une Debian
 

Re: Projet Cryptographie: Programme en C

Message le 01 Déc 2014 18:04

Bonsoir,
Je vous remercie d'avoir pris le temps de vous attarder sur mon problème et de me répondre. Je viens d'apporter quelques modifications à mon code, qui marche désormais et s'exécute sans faute, j'ai rajouté quelques contrôles, notamment la suppression des espaces comme exigé, et la conversion des lettres minuscules en majuscules. Tout s'exécute sans problème vous pouvez vérifier par vous même et l'exécuter avec plusieurs exemples pour voir mais je vous avoue que je ne suis pas encore satisfaite à 100% j'aimerai le rendre encore plus optimal si possible, si vous avez des idées à me proposer je suis preneuse. Je vous laisse exécuter, si vous voulez bien, merci d'avance à ceux qui le feront :)

Code: Tout sélectionner
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char*controle(char*message)
{
    int i=0,j,n=strlen(message);

    while(i<n)
    {    if ((message[i]<'A') || (message[i]>'Z') || (message[i]==' '))
         {   if((message[i]>='a') && (message[i]<='z'))
            { message[i]=message[i]-32;}
            else
                { for(j=i;j<n-1;j++)
                  {
                                message[j]=message[j+1];
                               
                  }n--;
                }
         }else i++;           
    }message[n]='\0';
   
    return(message);
}
 
void CESARcrypto (int cle, char *message)
{
     int i,n=strlen(message);

    for(i=0;i<n;i++)
    {
               
                message[i]='A'+((message[i] - 'A')+cle)%26;
    }
}
 
main()
{
      int k;
      char * message;
 
    printf("CRYPTAGE PAR SUBSTITUTION SELON JULES CESAR:\n\n");
   
    printf("Donner le message a crypter:\n");
    gets(message);
    message=controle(message);
    if(strlen(message)==0)
    {printf("ERREUR DE MESSAGE! REESSAYER!\n");}
    else
    {
    printf("Donner la clef du cryptage:\n");
    scanf("%d",&k);
                   if(k<0)
                   printf("ERREUR CLEF! VEUILLEZ RETAPEZ UNE CLEF CORRECTE (supérieure à 0)\n");
                   else
                   {
                       printf("Message a crypter: ");
                       puts(message);
                       printf("\n");
   
   
                       CESARcrypto(k,message);
                       printf("Message crypte: ");
                       puts(message);
                       printf("\n");
                    }
    }
 
    system("pause");
}


Aussi on nous a demandé d'inclure toutes les fonctions écrites en bibliothèques, je ne comprends et ne sais pas comment faire, dans le sens ou quand je dois rendre mon programme je dois inclure les bibliothèques de mes fonctions de façons à ce que mon programme ne contienne que la fonction principale main() qui elle fera appel aux fonctions incluses en-tête. Donc comment faire pour qu'une fonction par exemple dans mon cas CESARcrypto devienne une sorte de bibliothèque (extension .h ou .c) si je comprends bien, sinon j'aimerai bien que vous m'expliquiez davantage. Je suis désolée pour tout ça mais je débute :p

Merci à vous pour votre temps et vos efforts. Passez une excellente soirée :D
Avatar de l'utilisateur
POPPY ♥
Visiteur Confirmé
Visiteur Confirmé
 
Messages: 13
Inscription: 24 Sep 2014 18:25
 

Re: Projet Cryptographie: Programme en C

Message le 11 Déc 2014 17:01

Bonsoir,
S'il vous plait j'aimerai savoir, dans mon code précédent, est-ce que c'est normal que le programme s'exécute sans problèmes alors que j'ai fais une déclaration dynamique de la variable "message": char*message; et que je l'ai lu avec la fonction gets() sans avoir alloué de l'espace auparavant, avec la fonction malloc??? Normalement ce n'est pas normal! Et si c'est le cas, comment se fait-il alors que lorsque j'exécute ce petit code test et bien ça ne marche pas??? Quelqu'un pourrait-il m'éclairer s'il vous plait? C'est assez URGENT je dois remettre mon travail la semaine prochaine :oops:

Code: Tout sélectionner
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main()
{
     char*message;

     printf("Donner votre message:\n");
     gets(message);
     
system("PAUSE");
}


JE NE COMPRENDS PLUS RIEN T-T
Le C va me rendre dingue! HELP PLEASE :oops:
Avatar de l'utilisateur
POPPY ♥
Visiteur Confirmé
Visiteur Confirmé
 
Messages: 13
Inscription: 24 Sep 2014 18:25
 

Re: Projet Cryptographie: Programme en C

Message le 13 Déc 2014 09:37

POPPY ♥ a écrit:j'ai fais une déclaration dynamique de la variable "message": char*message; et que je l'ai lu avec la fonction gets() sans avoir alloué de l'espace auparavant, avec la fonction malloc??? Normalement ce n'est pas normal! Et si c'est le cas, comment se fait-il alors que lorsque j'exécute ce petit code test et bien ça ne marche pas??? Quelqu'un pourrait-il m'éclairer s'il vous plait? C'est assez URGENT je dois remettre mon travail la semaine prochaine :oops:

Tu donnes toi même la réponse... en C on doit forcément réserver la mémoire sur la variables déclarées de type "char *" avec une fonction malloc().
Si tu ne le fais pas le comportement du programme risque d'être aléatoire ou de carrément pas fonctionner.
D'ailleurs la 1ere fois que j'ai testé ton code, sous Linux avec GCC, perso j'ai ajouté un message=malloc(30) sinon ça plantait.
Avatar de l'utilisateur
CaSa
PC-Infopraticien
PC-Infopraticien
 
Messages: 9040
Inscription: 13 Mai 2003 16:32
Localisation: Sisteron... et jamais loin d'une Debian
 

Re: Projet Cryptographie: Programme en C

Message le 13 Déc 2014 13:24

Ah d'accord, donc c'est vraiment un coup de chance qu'il ait correctement fonctionné sans le malloc?
Je l'ai rajouté. Merci beaucoup :)
Avatar de l'utilisateur
POPPY ♥
Visiteur Confirmé
Visiteur Confirmé
 
Messages: 13
Inscription: 24 Sep 2014 18:25
 

Re: Projet Cryptographie: Programme en C

Message le 15 Déc 2014 07:18

Bonjour,
Je reviens une nouvelle fois auprès de vous car je rencontre de nouveau un souci avec mon programme, cette fois, cryptage de VIGENERE. Je vous explique le principe: Mon programme doit générer la table (grille) de VIGENERE, dont la première ligne contient toutes les lettres de l'alphabet la seconde toutes les lettres de l'alphabet à partir de B la suivante à partir de C etc.. à chaque fois on fait un décalage d'une lettre vers la gauche on aura à la fin une matrice carré d'ordre 26 avec toutes les lettres de l'alphabet sur la première ligne et sur la première colonne. Les lettres de la première ligne constituent celles du message à crypter, celles de la première colonne constituent les lettres de la clé à utiliser pour le cryptage. Ensuite, l'utilisateur doit entrer un message qui doit être constitué uniquement de lettres majuscules, j'ai écris une fonction qui permet de faire le contrôle sur le message et la clé tapés par l'utilisateur de façon à ce qu'il retourne comme résultat que des lettres majuscules (suppression de chiffres, symboles, caractères spéciaux, espaces et conversion de minuscules).Le cryptage se fait de la manière suivante: On prend un exemple: Message: ETUDIANT, Clé: BAC. On cherche sur la première ligne le caractère E de ETUDIANT et sur la première colonne le caractère B de BAC et on remplace le E de ETUDIANT par le caractère de l'intersection de la colonne E avec la ligne B et ainsi de suite. Le problème c'est que ici BAC est de taille plus petite que ETUDIANT et le programme doit dans ce cas générer la clé sur toute la longueur du message, ainsi BAC qui ne contient que 3 lettres, doit en contenir 8, on doit alors générer BACBACBA pour pouvoir coder tout le message, et c'est là que je rencontre un soucis. Je vous passe mon code, avec la fonction char*dupliquer conçue dans ce but et je vous prie d'essayer de trouver mon erreur, je vous serai infiniment reconnaissante:

Code: Tout sélectionner
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

char grille[26][26];
void grilleVIGENERE()
{
     int i,j;
   
     printf("CRYPTAGE PAR SUBSTITUTION SELON VIGENERE:\n\n");
     
     for(j=0;j<26;j++)
    grille[0][j]=65+j;
           
for(i=1;i<26;i++)
{ for(j=0;j<25;j++)
  grille[i][j]=grille[i-1][j+1];
       
        if(j==25) 
        grille[i][j]=grille[i-1][0];
}

printf("TABLE DE VIGENERE:\n");

for (i=0;i<26;i++)
{ for(j=0;j<26;j++)
       printf("%c ",grille[i][j]);
        printf("\n");
}
}

char*controle(char*message)
{
    int i=0,j,n=strlen(message);

    while(i<n)
    {    if ((message[i]<'A') || (message[i]>'Z') || (message[i]==' '))
         {   if((message[i]>='a') && (message[i]<='z'))
            { message[i]=message[i]-32;}
            else
                { for(j=i;j<n-1;j++)
                  {
                                message[j]=message[j+1];         
                  }n--;
                }
         }else i++;           
    }message[n]='\0';
   
    return(message);
}
 
char*dupliquer(int m, int n, char*cle)
{  int c=0, taille=m;
 
 
    while(c<n)
     {   
        cle[c+taille]=cle[c];
        m++;
        c++;
     }   
   cle[n]='\0';     
   return(message);
}
           
char*VIGENEREcrypto(char*message,char*cle)
{ int i,j,k,c=0,l=0,n=strlen(message),m=strlen(cle);
 
 
  while((c<n) && (l<m))
  { i=0;
    while((i<26) && (grille[i][0]!=cle[l]))
    {i++;}
     
     j=0;
     while((j<26) && (grille[0][j]!=message[c]))
     {j++;}
     
     message[c]=grille[i][j];
     c++;
     l++;
   }    
   return(message);
}

main()
{ char*message;
  char*cle;
  int n=strlen(message),m=strlen(cle);
 
  grilleVIGENERE();
  printf("\n");
 
  printf("Donner le message a crypter:\n");
  message=(char*)malloc(sizeof(char));
  gets(message);
 
  printf("Donner la clef du cryptage:\n");
  cle=(char*)malloc(sizeof(char));
  gets(cle);
 
  message=controle(message);
  printf("Message a crypter: ");
  puts(message);
 
  cle=controle(cle);
  if(m<n)
  {cle=dupliquer(m,n,cle);}
  printf("Cle a utiliser: ");
  puts(cle);
 
  message=VIGENEREcrypto(message,cle);
  printf("Message apres cryptage: ");
  puts(message);
   
 
  system("PAUSE");   

}


MERCI INFINIMENT A CEUX QUI PRENDRONT LE TEMPS DE M'AIDER :oops:
Bonne journée!
Avatar de l'utilisateur
POPPY ♥
Visiteur Confirmé
Visiteur Confirmé
 
Messages: 13
Inscription: 24 Sep 2014 18:25
 



Sujets similaires

Message [Projet] Refonte Pc pour gaming
Bonsoir,Je souhaiterais faire un cadeau à mon frère et remettre son pc au gout du jour. Je n'ai pas beaucoup d'éléments sur son pc actuel.Il a actuellement:- Une carte graphique AMD Radeon R9 380 series - Un processeur Intel Core I5-10400F CPU @ 2.90GHGz- 16GO de Ram en DDR3- Carte mère ASRock B460M ...
Réponses: 7

Message [Résolu] programme chinois
Bonsoir,je viens de constater en voulant désinstaller un programme que j'avais un programme en chinois impossible à désinstaller et sur lequel je n'ai aucune info....Je vous joins les rapports frst.FRST.txtAddition.txtAddition.txtMerci d'avance pour votre aide !
Réponses: 11

Message programme de lutte contre le courrier indesirable microsoft
Salut tout le monde, j'espère que tout le monde va bien (en ces temps difficiles) .....Voilà parfois sur ma messagerie Outlook (non premium) je reçoit ce genre de message et je ne sais pas quoi en penser est ce vraiment Microsoft ou un email malveillant dans le doute je supprime mais peu être faut- ...
Réponses: 6

Message projet pour enfants
Bonjours à tous,une amie, directrice de crèche d'enfants en déficit mentale se lance dans un projet pour la rentré.Faire l'achat de 5 PC bureautique et surtout jeux d'éveil du style adibou, dora l'exploratrice, teletubies et autre Français, math adapter à leur niveau donc grâce à certaine aide de l' ...
Réponses: 11

Message auncun programme ne s'ouvre
Bonjour, j'ai un problème depuis deux jours. J'avais un pc avec xp dessus, mais il plantait, j'ai voulu réinstaller xp, et après avoir galérer, car il y a plus de MAJ, je m?aperçois qu'aucun programme ne s'ouvre. Pour l?installation de certain programme j'avais besoin d'un dézippeur. J'ai essayé wi ...
Réponses: 2

Message Programme récalcitrant
Bonjour,Je viens vous demandez de l'aide sur les conseils d'un ami, voila j'ai un programme que j'aimerais désinstaller et qui je pense me pose problèmes pour mes partie en ligne.ce programme s'appelle SAntivirusje pense l'avoir désinstaller mais j'ai toujours des taches en cours que je n'arrive pas ...
Réponses: 9

Message programme par défaut
Bonjour sur un pc portable sous Windows 10 J'ai réintégré la visionneuse Windows 7 par défaut à la place du logiciel photo pour lire les images JPEG, BMP, ect. Tout fonctionne correctement sauf lorsque je branche un smartphone (Galaxy J3) et que j'ouvre le dossier DCIM pour consulter les photos, là ...
Réponses: 2


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités


.: Nous contacter :: Flux RSS :: Données personnelles :.