Crypter un fichier avec une clée symétrique

Portrait de furet

Voilà le but est simple on utilise un XOR pour crypter un fichier bit par bit. La méthode décrite est très simple à casser, en effet la clée du XOR étant sur 1 octect pour être sur de pouvoir le fichier quelque soit sa taille il existe seulement 255 combinaisons pour retrouver le texte (bien que le l'octet égal à 11111111b = 255d soit initule car on réalise simplement une inversion de bits).
Petit rappel sur la table de vérité du XOR :

0 0 0
0 1 1
1 0 1
1 1 0

le programme n'utilise que stdio et stdlib, un man permet d'obtenir des informations sur le fonctionnement des fonctions. A savoir l'opérateur XOR s'écrit ^ en C.

A compiler avec :
gcc -W -Wall -o crypt cryptXor.c pas de -ansi parceque sa sert à rien (en plus ca fera bloquer le compilateur).

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void chiffrer(unsigned char, FILE *,FILE *);
  5.  
  6. int main(int argc, char **argv){
  7. FILE *In, *Out;
  8. unsigned char clee;
  9. int toto;
  10.  
  11. // Validation des arguments de la ligne de commande
  12.  
  13. if(argc !=3){
  14. printf("Usage : %s <source> <destination>\n", *argv);
  15. return 0;
  16. }
  17.  
  18. // Ouverture du fichier en lecture binaire
  19.  
  20. if( (In = fopen(argv[1], "rb+")) == NULL ){ // affectation de In
  21. printf("%s introuvable\n",argv[1]);
  22. return -1;
  23. }
  24.  
  25. // Ouverture en écriture binaire du fichier de destination
  26.  
  27. if( (Out = fopen(argv[2], "rb+")) == NULL ){ // affectation de Out
  28. printf("%s impossible à créer\n",argv[2]);
  29. fclose(In);
  30. return -1;
  31. }
  32.  
  33. // Saisie de la clée (sur 1 octet)
  34. printf("\nEntrez une clée de chiffrement sur 1 octet\n");
  35. scanf("%d",&toto);
  36. if(0 > toto || toto > 255){
  37. printf("Clée incorecte. Attention la clée ne doit pas dépasser 255!\n");
  38. fclose(In);
  39. fclose(Out);
  40. return -1;
  41. }
  42. clee = (unsigned char)toto;
  43. // Chiffrement du fichier
  44.  
  45. chiffrer(clee, In, Out);
  46. fclose(In);
  47. fclose(Out);
  48. printf("Terminé\n");
  49.  
  50. return 0;
  51. }//void main(int, char **)
  52.  
  53. void chiffrer(unsigned char k, FILE *entre, FILE *sort){
  54. unsigned char octet;
  55.  
  56. while( fread(&octet,1,1,entre) ){
  57. octet ^= k;
  58. fwrite(&octet,1,1,sort);
  59. }
  60.  
  61. }// fin chiffrer(unsigned char, FILE *, FILE *)