Codeur de texte en C

Fermé
nicoolman - 26 oct. 2009 à 10:18
 nicoolman - 27 oct. 2009 à 14:21
Bonjour,
voila je cherche à créer un logiciel de cryptage qui utilise la technique du masque jetable,
mais la je bloque sur un problème, j'aurais besoin d'utiliser des int pour afficher des lettre, mais
voila quand je change mes char en int cela rentre en conflit avec gets, fgets, je pourait utiliser scanf mais
je n'aurait pas le resultat que je souhaite (les espaces doivent aussi être codés). voici mon code source :

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


int main ( int argc, char** argv )

{

char texte[100];
char *frein_du_crypteur;
const char MAX = 127, MIN = 1;
char crypteur = 0;

gets(texte);
printf("\n\n");

for (frein_du_crypteur = texte; *frein_du_crypteur != 0; frein_du_crypteur++)

{
crypteur = (rand() % (MAX - MIN ));
(*frein_du_crypteur) += crypteur;

printf ("%c", crypteur);

if (*frein_du_crypteur >= 128)

{
(*frein_du_crypteur)-=127;
}
}

printf ("\n\n%s", texte);

getchar();

return 0;

}

8 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
27 oct. 2009 à 11:02
ça y est, j'ai compris !
je n'avait pas vu que ta clé de cryptage était dans le for, du coup tu la perds !
Si tu sort le rand() de la boucle ça devrais mieux fonctionné.
Pour le "z", j'ai mal lu, le if est après le décryptage.
1
c pas mal du tous on a progresser mais maintenant un petit problème qui je pense trouvera vite solution .
le programme crypte et decripte bien mais avec la même lettre ce que je ne souhaite pas .
0
nicoolman > nicoolman
27 oct. 2009 à 11:26
entrez le texte a coder : je m'appelle nicolas


masque de cryptage : →→→→→→→→→→→→→→→→→→→→

texte avec masque : ä☺:çA{èè☺åå☺:êâ}ëå{ì

utilisation de ce masque : →→→→→→→→→→→→→→→→→→→→

texte sans masque : je m'appelle nicolas

appuyez sur une touche pour
que le programme se finisse.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
27 oct. 2009 à 12:12
Après, c'est plus dur, il faut remettre le rand() dans ta boucle mais incrémenter à chaque fois crypteur et donc lui allouer l'espace minimum.
1
sa veu dire que je doit faire 100 valeurs 'crypteur' ?!
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298 > nicoolman
27 oct. 2009 à 12:57
autant que tu as de caractère. 100, plus ou moins, ça dépend.
0
nicoolman > Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023
27 oct. 2009 à 13:25
et comment lui dire de prendre la variable suivante ?
parce que l'incrementation rajoute une valeur a une variable et je ne vois pas comment faire ?
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
27 oct. 2009 à 14:11
regarde du coté des tableaux.
crypteur++
1
ok merci beaucoup
0
si quelqu'un cherche peu-t-il se manifester ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bon ba personne cherche
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
26 oct. 2009 à 12:48
pourquoi utiliser des int ?
Sinon, il faut que tu passes par des variables temporaire en char.
Je suis désolé, mais j'ai un peut de mal à comprendre ton souci.
0
pour ca je me suis débrouillé mais maintenant j'ai un autre problème quand je cherche a décrypter le message il n'y a que la dernière lettre qui se decrypte (parce que la variable crypteur ne garde que la dernière clé en mémoire) comment arranger cela ? :

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


int main ( int argc, char** argv )

{

char texte[100];
char *frein_du_crypteur;
const char MAX = 60, MIN = 0;
char *crypteur ;

gets(texte);
printf("\n\n");

for (frein_du_crypteur = texte; *frein_du_crypteur != 0; frein_du_crypteur++)

{
*crypteur = (rand() % (MAX - MIN ));
(*frein_du_crypteur) += *crypteur;

printf ("%s", crypteur);

if (*frein_du_crypteur >= 61)

{
(*frein_du_crypteur)-=61;
}
}

printf ("\n\n%s", texte);


printf("\n\n");

for (frein_du_crypteur = texte; *frein_du_crypteur != 0; frein_du_crypteur++)

{

(*frein_du_crypteur) -= *crypteur;



if (*frein_du_crypteur <= -1)

{
(*frein_du_crypteur)+=61;
}

}

printf ("\n\n%s", texte);


return 0;

}
0
nicoolman > nicoolman
26 oct. 2009 à 16:30
au fait voila ce que cela donne :


nicolas (le texte tapé)


)/"(↔♦↕ (la clé de cryptage)

ùÿàùë(à (le texte encrypté)



┬├s┬w▬s (le texte avec selement la dernière lettre décryté)
Process returned 0 (0x0) execution time : 6.703 s
Press any key to continue.
0
loupius > nicoolman
26 oct. 2009 à 18:09
Il a mis plus de 6 secondes pour exécuter ces quelques lignes ;-)
Ca doit boucler quelque part !
Bonne continuation.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
26 oct. 2009 à 16:55
Je ne voi pas le souci là.
à la place de ton printf(%s,texte), écrit des nombres : printf("%d %d %d\n",texte[0],texte[1]...);
Comme ça tu débugue en ASCII et tu sais à combien tu es.
https://fr.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange
Pour info, a-b codé de 97 à 122 (ton 60 semble faux du coup)
0
mais moi je voudrais que la valeur 'crypteur' enregistre toutes les lettre qu'elle a trouvé au hasard pour les soustraire aux texte lord du decryptage, mais la elle ne retient que la dernière lettre trouvé au hasard et ne decripte correctement que la dernière lettre.
0
nicoolman > nicoolman
26 oct. 2009 à 20:46
peu etre que vous comprendrez mieu ce qui ce passe comme ça :

aa


)/

èÉ

//

[a
Process returned 0 (0x0) execution time : 1.187 s
Press any key to continue.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
27 oct. 2009 à 08:25
bon alors, pour être plus clair.
ta variable aléatoire est comprise entre 0 et 60.
Ton texte, si on suppose qu'il est en minuscule (pour commencer) prend des valeurs de 97 à 122.
un char (1 octet) prend une valeur allant de -128 à 127.
Lorsque tu additionnes ton texte à ta variable aléatoire, tu couvre une plage allant de 97 à 127 et de -128 à -63 (pas sur du -63, mais c'est dans l'idée) selon la valeur du texte et celle de la variable.
si par exemple, tu prend "z" (donc 122) et que tu lui ajoute (variable aléatoire) 7, tu obtiens -127. Cette valeur est inférieur à 61, donc tu ne la modifie pas. Lors du décryptage la valeur est inférieur à -1, tu lui ajoute alors 61 pour obtenir -66, qui correspond à un caractère étendue. C'est ton algorithme qui est mauvais.
D'ailleurs si tu relis le message que tu as mis, ton texte encrypté est bien différent du texte décrypter, preuve que ce n'est pas un problème que seul le dernier caractère est modifié.
0
je suis d'accord mais pourquoi j'obtient ceci avec z :

entrez le texte a coder :z


masque de cryptage : )

texte avec masque : ú

utilisation de ce masque : )

texte sans masque : z

appuyez sur une touche pour
que le programme se finisse.
0
nicoolman > nicoolman
27 oct. 2009 à 10:00
sa marche même avec l'avant dernier du code ascii :

entrez le texte a coder :~


masque de cryptage : )

texte avec masque : º

utilisation de ce masque : )

texte sans masque : ~

appuyez sur une touche pour
que le programme se finisse.
0