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 =)