cryptage de fichier avec XOR

cryptage de fichier avec XOR - C - Programmation

Marsh Posté le 16-09-2004 à 14:27:24    

hello,  
j'ai un pitit problème sur un programme:
 
le but du prog, est d'ouvrir un fichier, de le crypter et de mettre le resultat dans un autre fichier.
une autre fonction fait le travail inverse (ouvre le fichier illisible, le decrypte et le met dans un troisieme fichier)
 
ça fonctionne si le contenu du fichier est inferieur à la taille du buffer, mais sinon, ben ça merde àla fin de la premiere boucle.
 
Je pense que ça foire dans le decryptage, enfin je suis pas sur :/
 
 
ha ouai, sinon j'utilise un cryptage avec XOR et la taille de mon buffer est de la même taille que ma clé.
 
 
 

Code :
  1. int crypt_mail(char *file_name)
  2. {
  3. FILE *fd;
  4. FILE *fd_2;
  5. char buf[BUF_SIZE];
  6. char tmp[BUF_SIZE];
  7. int  i;
  8. int  j;
  9. if ((fd = fopen(file_name, "r+b" )) == 0) //ouvre en lecture binaire
  10.  return (1);
  11. /*move_to_cpt change le nom du fichier de *.txt à *.cpt*/
  12. if ((fd_2 = fopen(move_to_cpt(file_name), "a+b" )) == 0)
  13.  return (2);
  14. while (i = fread(&buf, sizeof(char), BUF_SIZE, fd))
  15.  {
  16.   buf[i] = '\0';
  17.   for (j = 0; buf[j];j++)
  18.    tmp[j] ^= buf[j];
  19.   tmp[i] = '\0';
  20.   //on ecrit le buff encodé dans le nouveau fichier
  21.   fprintf(fd_2, "%s", tmp);
  22.  }
  23. fclose(fd);
  24. fclose(fd_2);
  25. return (0);
  26. }
  27. int decrypt_mail(char *file_name)
  28. {
  29. FILE *fd;
  30. FILE *fd_2;
  31. char buf[BUF_SIZE];
  32. char tmp[BUF_SIZE];
  33. int  i;
  34. int  j;
  35. if ((fd = fopen(file_name, "r+b" )) == 0)
  36.  return (1);
  37. if ((fd_2 = fopen("decrypt.txt", "a+b" )) == 0)
  38.  return (2);
  39. while (i = fread(&buf, sizeof(char), BUF_SIZE, fd))
  40.  {
  41.   buf[i] = '\0';
  42.   for (j = 0; j != i; j++)
  43.    tmp[j] ^= buf[j];
  44.   tmp[j] = '\0';
  45.   fprintf(fd_2, "%s", tmp);
  46.  }
  47. fclose(fd);
  48. fclose(fd_2);
  49. return (0);
  50. }


 
 
 
voila, si quelqu'un à de l'inspiration qu'il m'en fasse part  
 
 :hola:

Reply

Marsh Posté le 16-09-2004 à 14:27:24   

Reply

Marsh Posté le 16-09-2004 à 14:54:57    

bon, en fait j'ai trouvé mes erreurs  
 
 
j'ai remplace le fprintf par un write, et me suis  apperçut que j'utilisais pas ma clé  :sweat:  
 
 
 
enfin la ça fonctionne.
 :bounce:  
 
merci encore :)
 
juste pour info, le code :
 

Code :
  1. int crypt_mail(char *file_name)
  2. {
  3. FILE *fd;
  4. FILE *fd_2;
  5. char buf[BUF_SIZE];
  6. char tmp[BUF_SIZE];
  7. int  i;
  8. int  j;
  9. if ((fd = fopen(file_name, "r+b" )) == 0) //ouvre en lecture binaire
  10.  return (1);
  11. if ((fd_2 = fopen(move_to_cpt(file_name), "a+b" )) == 0)
  12.  return (2);
  13. while (i = fread(&buf, sizeof(char), BUF_SIZE, fd))
  14.  {
  15.   buf[i] = '\0';
  16.   for (j = 0; buf[j];j++)
  17.    tmp[j] = buf[j] ^ key[j];
  18.   tmp[i] = '\0';
  19.   //on ecrit le buff encodé dans le nouveau fichier
  20.   fwrite(&tmp, sizeof(char), j, fd_2);
  21.   //fprintf(fd_2, "%s", tmp);
  22.  }
  23. fclose(fd);
  24. fclose(fd_2);
  25. return (0);
  26. }

Reply

Marsh Posté le 16-09-2004 à 16:49:31    

pourquoi tu utilise 2 buffers différents ?
utilise NULL au lieu de 0
utilise l'opérateur sizeof quand tu le peux
quand à ton code il est incorrect, si ton fichier contient un 0, tu vas tout arrêter pour rien

Reply

Marsh Posté le 16-09-2004 à 17:22:58    

J'ai utilisé 2 buffer différents sans faire gaffe, mais c'est vria qu'un seul suffit.
Pourquoi utiliser null si j'aime utiliser 0?
jvois pas trop le problème avec sizeof
et enfin je crypte un fichier texte, donc il ne devrait pas y avoir de 0 (si je ne m'abuse)

Reply

Marsh Posté le 16-09-2004 à 17:30:46    

y a pas de 0 en ascii mais à part ça ...
 
t'as pas à aimer 0, un pointeur nul en C, c'est NULL, de type (void*) et rien d'autre. sinon, tu vas voir comment ça va chier sur machine ou sizeof(void*) != sizeof(int), tu vas pleurer ...

Reply

Marsh Posté le 16-09-2004 à 17:37:14    

t'entend quoi par "ya pas de 0 en ascii"?
 
et ou est-ce que tu veux que j'utilise null et pourquoi?

Reply

Marsh Posté le 16-09-2004 à 17:59:49    

1) l'octet 0 est utilisé dans certaines représentations de texte
2) parce que 0 est de type entier et pas de type void*. de toute évidence tu ne le sais pas et ne comprends les implications ...

Reply

Marsh Posté le 16-09-2004 à 19:25:16    

1) ok
2)ouai, j'avait tilté pour le type, mais c'est quoi les implications justement ?

Reply

Marsh Posté le 16-09-2004 à 19:36:10    

que tu risques d'être victime de conversions dégradantes

Reply

Marsh Posté le 16-09-2004 à 21:36:09    

Contrairement aux idees recues, NULL est de type int dans la pluspart des implementations (i.e. #define NULL 0), bien que le C ANSI autorise egalement #define (void *)0.

Reply

Marsh Posté le 16-09-2004 à 21:36:09   

Reply

Marsh Posté le 17-09-2004 à 00:27:08    

mouef, tu confonds avec le C++ où 0 est une valeur spéciale je pense, j'ia vu très peu d'environnement C où NULL n'était pas un void*

Reply

Marsh Posté le 17-09-2004 à 22:50:32    

Verification faite sous linux c'est ((void *)0). Sous AIX c'est 0.

Reply

Marsh Posté le 17-09-2004 à 22:55:07    

t'es sur que le compilateur d'AIX n'est pas mixte ? de toutes façons, ça m'étonnerait pas que le compilo AIX soit défficient car anté-déluvien ... attention aux surpises ...

Reply

Marsh Posté le 18-09-2004 à 07:27:55    

Le compilo d'AIX (Visual Age) est parfaitement maintenu et développé, et est d'ailleurs à la pointe en matière d'optimisation pour l'architecture Power. Je crois que si gcc était aussi performant ça comblerait les grincheux au delà de leurs espérances ;)
 
Celà dit j'ai fais les tests avec #include <stdlib.h> et le flag -E, donc le compilo n'a rien à voir là dedans.

Reply

Marsh Posté le 18-09-2004 à 10:27:15    

quoi ? compilo ça inclue le cpp, on va pas chipoter ... toutes façons je vois pas ce que tu veux que ça soit à part une macro ?

Reply

Marsh Posté le 18-09-2004 à 13:39:02    

matafan a écrit :

Le compilo d'AIX (Visual Age) est parfaitement maintenu et développé, et est d'ailleurs à la pointe en matière d'optimisation pour l'architecture Power.  


 
 [:autobot] j'ai mal lu là non ???  [:a_bon]

Reply

Marsh Posté le 18-09-2004 à 14:46:34    

(moi aussi je pense avoir mal lu, mais n'ayant pas d'AIX sous la main-

Reply

Marsh Posté le 18-09-2004 à 18:57:59    

Joel, tu as peut-être une vieille version du compilo, mais je t'assure qu'il est activement développé et n'a rien d'obsolète... Je bosse sur les outils de perf AIX (ce qui inclue tprof, un profileur dont les dev du compilo sont d'ailleurs de grands utilisateurs), donc je parle en connaissance de cause. Maintenant évidemment, comme beaucoup de clients utilisent encore de vieilles versions d'AIX et du compilo (ce qui n'est pas un problème en soi), on a vite fait de tirer des conclusion hative. Faut juste savoir de quoi on parle. Enfin bon on disgresse, fin de la parenthèse.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed