[ Je décrypte un message en C ]

Résolu/Fermé
Utilisateur anonyme - 19 juil. 2005 à 01:26
 un peu tard ... - 18 nov. 2009 à 12:15
Bonjour à tous et à toutes

j'ai crée un script en C permettant de décrypter un message, au préalable, je connais comment le message est crypté.

la lettre 'm' vaut 'a' , 'n' vaut 'b', etc... donc un décalage de 12 sur l'alphabet

Je tourne sur une Linux/Unix

Voici la source:

---------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------
/* Programme qui scanne les textes cryptées et qui les transforment en français */
#include <stdio.h>

main()
{

char str[10000];
int canal;

printf(" Insérer votre texte crypté, merci :\n");
gets (str);
canal = 0;
while (str[canal]){
if ((str[canal] >= 97) && (str[canal] <= 122))

str[canal] -= 12; /* je décrypte en retirant 12 du code ascii*/


canal++;
}
printf("Le texte est décrypté et mis en net :\n");
puts(str);
return 0;
}

-----------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------
A la compilation, c'est acceptable sauf un message d'alerte sur la fonction 'gets'
mon programme s'appelle alpha

[golgo13@localhost sources]$ gcc -c alpha.c
alpha.c:24:4: warning: no newline at end of file
[golgo13@localhost sources]$ gcc -o alpha alpha.c
alpha.c:24:4: warning: no newline at end of file
/home/golgo13/tmp/cc4mSANz.o(.text+0x3a): In function `main':
: warning: the `gets' function is dangerous and should not be used.
[golgo13@localhost sources]$ ./alpha
Insérer votre texte crypté, merci :
nopqrstuvwxyzabcdefghijklm
Le texte est décrypté et mis en net :
abcdefghijklmTUVWXYZ[\]^_`
[golgo13@localhost sources]$
***********************************************************************************************************

Là, je trouve une grosse erreur sur le programme, j'ai pas tenu compte
que le programme lit en ascii
(ascii ----------->http://www.lookuptables.com/) , c'est-à-dire, de [a à z] en ascii, c'est pas une boucle, donc comment faire pour avoir tout le message décrypté...

Je suis novice sur le langage de programmation, ce serait bien si vous pouviez me donner une aide, une syntaxe appropriée, un coucou...
(c;[)
en vous remerciant d'avance,


Bxflash
le 19.07.05

4 réponses

nico7382 Messages postés 279 Date d'inscription lundi 6 juin 2005 Statut Membre Dernière intervention 22 décembre 2010 50
19 juil. 2005 à 08:19
Salut,

ce que je te conseil, je ne l'ai pas compilé mais je pense qu'il faudrait, faire un teste de plus apres
if ((str[canal] >= 97) && (str[canal] <= 122))
/*du style:*/
{
   if (str[canal]>109)
      str[canal]-=12
   else
      str[canal]+=14  
}


Bonne continuation
1
un peu tard ...
18 nov. 2009 à 12:15
pour le gets c'est simplement dû au fait que le gcc t'indique qu'il peut y avoir plus de caractères saisis que ce que tu as prévu dans ta chaîne.

Il est donc mieux d'utiliser :
fgets(str, nbCarMax, stdin);

voilà de cette façon plus de warning :)

Un peu tard je sais ...
1
XtremDev Messages postés 3 Date d'inscription vendredi 8 juillet 2005 Statut Membre Dernière intervention 25 juillet 2005
19 juil. 2005 à 10:02
il vaut mieux différencier les majuscules des minuscules et de pas effectué la translation si, la caractère n'est pas un lettre.

pour reboucler sur le début de l'alphabet quand on passe à une lettre supérieur à 'l', on peut utiliser la fonction modulo (%).

ça donne :

if ((str[canal] > 96) && (str[canal] < 123))
{
      str[canal] = (str[canal] - 97 + 14)%26 + 97;
}
else if ((str[canal] > 64) && (str[canal] < 91))
{
      str[canal] = (str[canal] - 65 + 14)%26 + 65;
}
0
Utilisateur anonyme
19 juil. 2005 à 18:21
Salut

Excusez-moi pour le retard, j'essayais vos idées...

Je tiens à remercier nico7382 , XtremDev et tous ceux et toutes celles
qui se sont penchés sur le problème.

Je devais rajouter des conditions pour les exceptions.

Reste maintenant les exceptions pour les majuscules et les caractères
spéciaux, ce sera pour demain.

comme celà, le programme sera complet et fonctionnel...
J'ai fait un décalage de 13, car celui de 12 bugguait c'est
l'alghoritme de Rot13 (ou Caesar?).

Merci beaucoup


/* Programme qui scanne les textes cryptées et qui les transforment en français */
#include <stdio.h>

main()
{

char str[10000];
int canal;

printf(" Insérer votre texte crypté, merci :\n");
gets (str);
canal = 0;
while (str[canal]){
if ((str[canal] >= 97) && (str[canal] <= 122))

if (str[canal]>109)
str[canal]-=13; /* retrait de 13 en ascii */
else
str[canal]+=13 ; /* ajout de 13 en ascii */




canal++;
}
printf("Le texte est décrypté et mis en net :\n");
puts(str);
return 0;
}

----------------------bxflash-----------------------------------------------
0