CRYPT-DECRYPT AVEC XOR

cs_Bki Messages postés 32 Date d'inscription vendredi 18 janvier 2002 Statut Membre Dernière intervention 25 mai 2004 - 14 avril 2003 à 01:46
D1m3x Messages postés 402 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 21 juillet 2005 - 4 mai 2003 à 20:53
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/10660-crypt-decrypt-avec-xor

D1m3x Messages postés 402 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 21 juillet 2005 1
4 mai 2003 à 20:53
Euh je vois pas pk tu met: char char mot[999];
le maximum de lettre d'un char étant de 256 ça ne te sert strictement à rien!
cs_GoldenEye Messages postés 527 Date d'inscription vendredi 14 septembre 2001 Statut Membre Dernière intervention 6 octobre 2008 4
16 avril 2003 à 23:23
Laisse à l'user le soin de choisir la clé
soseki Messages postés 3 Date d'inscription vendredi 11 octobre 2002 Statut Membre Dernière intervention 16 avril 2003
16 avril 2003 à 22:28
C juste pour qu'il est une valeur, on peut mettre ce que l'on veut.
ça changera l'apparence du contenu du fichier crypté.
!!!!Le code que j'ai mis est faux :
il faut mettre des 1 à la place des 2 au niveau du while et du fwrite !!!!
désolé
cs_GoldenEye Messages postés 527 Date d'inscription vendredi 14 septembre 2001 Statut Membre Dernière intervention 6 octobre 2008 4
16 avril 2003 à 19:03
pourquoi CLE est égal à 57 ? :-))
soseki Messages postés 3 Date d'inscription vendredi 11 octobre 2002 Statut Membre Dernière intervention 16 avril 2003
16 avril 2003 à 16:23
Pour le cryptage XOR, je crois que cela suffit non ?:

/* cryptage XOR */

#include <stdio.h>
#define CLE 57

void main(int argc, char**argv)
{
FILE *In,*Out;
unsigned char byte;


if (argc != 3)
{
printf("
Usage : %s <fichier source> <fichier destination>
",argv[0]);
exit(0);
}


if ((In = fopen(argv[1], "rb+"))== NULL)
{
printf("Fichier %s introuvable!
",argv[1]);
exit(-1);
}

if ((Out = fopen(argv[2], "wb+" ))== NULL)
{
printf("Fichier %s imppossible à créer
",argv[2]);
fclose(In);
exit(-1);
}

while (fread(&byte,2,2,In))
{
byte ^=CLE;
fwrite(&byte,2,2,Out);
}
fclose(In);
fclose(Out);
}
Krox68 Messages postés 157 Date d'inscription jeudi 17 octobre 2002 Statut Membre Dernière intervention 11 septembre 2004 1
16 avril 2003 à 15:19
ok merci pour vos bons commentaires,
c'est si rare...
cs_GoldenEye Messages postés 527 Date d'inscription vendredi 14 septembre 2001 Statut Membre Dernière intervention 6 octobre 2008 4
15 avril 2003 à 15:36
C bon mais alors c'est long comme code !!!!!!!!!!!!!!!!!! (cf ma source sur le même sujet)
PAS DE GOTO !!!
crypt et decrypt, c'est la même chose effectivement
cs_AmK Messages postés 368 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 27 janvier 2010 1
15 avril 2003 à 15:12
Ben ya comme meme quelques erreurs,(je suis sur que t'as pas fait expres de les faire
ça peut arriver :))

1- puisque tu utilises exit(0) tu devrais alors inclure le fichier d'entete <stdlib.h>
2-inclure le header file <string.h> pour strlen
3-Tu as declare ta fonction de type int , mais quand tu l'as appelle tu as fait comme ci
elle etait de type void !

donc au lieu de int decrypt();
mets : void decrypt();

c'est pareil pour crypt(); !

voila ta source sans les bugs :

#include
#include <stdio.h>
#include <conio.h>
#include <string.h> /* Pour strlen ! */
#include <stdlib.h> /* Pour exit ! */


/*############################################################################*/


void crypt()
{
char mot[999];
char crypt[999];
int cle;



cout << "mot a crypter : ";
cin>>mot;

cout << "cle numerique : ";
cin >> cle;

for(int n=0;n<strlen(mot);n++)
{
crypt[n] = mot[n] ^ cle;
}

cout << crypt;
}


/*############################################################################*/


void decrypt()
{
char motc[999];
char decrypt[999];
int cle2;



cout << "mot : ";
cin>>motc;
cout << "cle numerique : ";
cin >> cle2;

for(int n=0;n<strlen(motc);n++)
{
decrypt[n] = motc[n] ^ cle2;
}

cout << decrypt;
}

/*############################################################################*/


int main()
{
int choix;

cout << "1.Crypter
2.Decrypter
";
cin >> choix;

switch(choix)
{
case 1:
crypt();
break;

case 2:
decrypt();
break;

default:
exit(0);
break;
}
getchar();

}

PS: j'ai mis cin , a la place de gets mais je suis pas sur de mon coup là!
une chose est sur avec gets ça marchait pas bien,parceque impossible de saisir le mot !

Voila tu peux aussi comme l'a dis goldeneye inscrire le tout dans un fichier ça serait pas mal !
par exemple voila la source de cryptage seulement avec fichier :

#include <stdio.h>
#include <string.h>
#include <econio.h>

struct compi {char mot[999],motc[999];int cle ; }; /* Strcture qui va nous servir pour la manipulation de fichiers !*/

void fichier();
void fenetre();

void fichier() /* Definition de la fonction fichier */

{


FILE *X;
char rep;
int t,i;
compi c; /* Variable de type structure */
int cle;


textcolor(12);
textbackground(10);
printf("
Programme de cryptage du XOR en mode fichier
");
X=fopen("crypta.txt","a+"); /* Ouverture du fichier en mode a+ c'est a dire on peut ajouter des donnees sans detruire */
do
{
printf("
Entrez votre mot et votre cle !");
scanf("%s %d",&c.mot,&c.cle);
fwrite(&c,sizeof(compi),1,X);


t=strlen(c.mot);
for (i=0;i<=t;i++)
{
c.motc[i]=c.mot[i] ^ cle;
}

printf("
Voila votre texte Crypté ! : %s",c.motc);
fwrite(&c,sizeof(compi),1,X);

printf("
Encore ?");
rep=getche();
}
while (rep=='o');

fclose(X);
}

void fenetre()
{
char mot1[999],motc1[999];
int n,cle1,j;
textcolor(16);
textbackground(20);
printf("
Cryptage du XOR en mode Direct !
");
printf("
Quel est le mot à crypter ?");
scanf("%s",&mot1);
printf("
Quelle est la cle avec laquelle tu vas crypter ?");
scanf("%d",&cle1);

n=strlen(mot1); // Calcul de la taille du mot

for (j=0;j<=n;j++)
{
motc1[j]=mot1[j] ^ cle1; // on applique l'operateur du xor lettre par lettre jusqu'a la fin du mot
}
printf("
Voila votre texte Crypte ! :
%s",motc1);
}

void main()
{
int choix;
retour:
printf("
1-Mode Fichier
2-Mode Direct
");
scanf("%d",&choix);
switch(choix)
{
case 1:
fichier(); // Appel de la fonction fichier();
break;

case 2:
fenetre(); // Appel de la fonction fenetre();
break;

default :
goto retour;
break;
}
}

/*fin */
Amicalement
A++
cs_GoldenEye Messages postés 527 Date d'inscription vendredi 14 septembre 2001 Statut Membre Dernière intervention 6 octobre 2008 4
15 avril 2003 à 11:02
Ah aussi, "clé" n'est pas forcément un int, ce serait mieux si c'était un char * que tu fais tourner sur la longueur de la chaine à coder
ex
BONJOUR avec comme clé PSG
B xor P
O xor S
N xor G
J xor P
...
cs_Bki Messages postés 32 Date d'inscription vendredi 18 janvier 2002 Statut Membre Dernière intervention 25 mai 2004
14 avril 2003 à 21:25
Je n'ai pas dit le contraire :)
Krox68 Messages postés 157 Date d'inscription jeudi 17 octobre 2002 Statut Membre Dernière intervention 11 septembre 2004 1
14 avril 2003 à 17:45
GOLDENEYE...pardon pour le Gildeneye
Krox68 Messages postés 157 Date d'inscription jeudi 17 octobre 2002 Statut Membre Dernière intervention 11 septembre 2004 1
14 avril 2003 à 17:42
merci Gildeneye jy pense...
moi je trouve kil est bien mon prog
non ?
cs_Bki Messages postés 32 Date d'inscription vendredi 18 janvier 2002 Statut Membre Dernière intervention 25 mai 2004
14 avril 2003 à 15:12
<conio.h>... made by Borland... non portable
cs_Bki Messages postés 32 Date d'inscription vendredi 18 janvier 2002 Statut Membre Dernière intervention 25 mai 2004
14 avril 2003 à 14:38
J'vaux dire que ça parait un peu trop enfantin pour un niveau 2 :)
cmarsc Messages postés 455 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 18 décembre 2003
14 avril 2003 à 11:49
strlen est dans <string.h>
getch() (<conio.c> ou .h) plus pratique que getchar() ( standard <stdio.h> )
cs_GoldenEye Messages postés 527 Date d'inscription vendredi 14 septembre 2001 Statut Membre Dernière intervention 6 octobre 2008 4
14 avril 2003 à 11:19
T'inscris ça dans un fichier et ce sera nickel
cs_Bki Messages postés 32 Date d'inscription vendredi 18 janvier 2002 Statut Membre Dernière intervention 25 mai 2004
14 avril 2003 à 01:46
C'est du niveau 2 ça ?????
Rejoignez-nous