Chiffre de césar

Fermé
cloc - 21 janv. 2016 à 22:41
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 22 janv. 2016 à 23:59
Bonjour,

Je dois mettre en place un algorithme de codage simple par décalage des lettres de l'alphabet.Le principe est que si la clé vaut 3 par exemple,on va faire un décalage de 3 caracteres, ainsi le A devient le D, le B devient le E , le Z devient le C.C'est circulaire.
J'ai deja mis en place un programme en c, mais je ne sais pas comment faire le décalage circulaire.
voici mon code:

#include <stdio.h>
#include <stdlib.h>

char crypter_caractere(char c,int cl)
{
int k,k2;char c2;
k=(int)c;
k2=k+cl;
c2=(char)k2;
return c2;

}
char decrypter_code(char c,int cl)
{
int k,k2;char c2;
k=(int)c;
k2=k-cl;
c2=(char)k2;
return c2;
}
int main()
{ char texteClair[]="SECRETCODE";
char texte_crypte[100];
char texte_decrypte[100];
int cle,i;char d;
do
{

printf("Saisir la cle\n");
scanf("%d",&cle);
}while(cle>=26);
for(i=0;i<strlen(texteClair);i++)
{
texte_crypte[i]=crypter_caractere(texteClair[i],cle);

}
printf("Texte crypte:\n");

for(i=0;i<strlen(texteClair);i++)
{
printf("%c",texte_crypte[i]);

}
printf("\n");
for(i=0;i<strlen(texteClair);i++)
{
texte_decrypte[i]=decrypter_code(texte_crypte[i],cle);

}
printf("Texte decrypte:\n");
for(i=0;i<strlen(texteClair);i++)
{
printf("%c",texte_decrypte[i]);

}



return 0;
}
















1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
21 janv. 2016 à 22:56
Bonjour,

On ne dit pas crypter mais chiffrer :-). De même, dans ton cas, ça sera déchiffrer. Ensuite, tu aurais dû plutôt faire les boucles for dans tes fonctions. Ca serait plus propre.
Pour le côté circulaire, il suffit d'utiliser modulo (opérateur %).
Par exemple, si tous tes caractères sont en majuscule :
k2 = (k - 'A' + cl) % 26 + 'A';


Quelques remarques sur le code :

int main()
Le bon prototype est int main(void)

while(cle>=26);
Il faudrait aussi vérifier que cle n'est pas négatif.

Tu peux également simplifier tes fonctions de chiffrement et déchiffrement. Pas besoin de tant de variables, un simple return est suffisant.

Note : pour la prochaine fois, au lieu d'utiliser la balise code, utilise plutôt code c. Cela mettra de la couleur :-).
--

Google is your friend
0
merci pour vos remarques, je les prendrais en compte!
mais je ne comprends pas pourquoi vous avez fait k2 = (k - 'A' + cl) % 26 + 'A';?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
21 janv. 2016 à 23:51
k représente le code ASCII du caractère en clair. Il est compris entre 'A' et 'Z'.
Avant d'appliquer le modulo, il faut ramener l'intervalle entre 0 et 26. On fait donc k-'A'.
Ensuite, on applique la clé et le modulo : (k-'A'+cl)%26. Et enfin, on ramène l'intervalle entre 'A' et 'Z' en refaisant une addition avec 'A'.
Prends un papier et vérifier avec différentes valeurs de k. Tu comprendras mieux.
0
J'ai vérifié avec différents valeurs de k,ça marche.
je suis d'accord que le k représente le code ASCII du caractère et qu'il est compris entre 'A' et 'Z'.
Mais pourquoi ramener l'intervalle entre 0 et 26?
0
c'est que j'ai du mal avec l'opération modulaire utilisé dans ce contexte
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
22 janv. 2016 à 23:59
Justement, c'est bien pour comprendre le fonctionnement du modulo que je te conseillais de vérifier manuellement.
Ce sont des maths là. Le modulo 26 ramène à l'intervalle 0 25. Donc si le caractère que tu souhaites chiffrer n'est pas dans cet intervalle, ça ne sera pas bon.
0