MagPI 6 Page 24
De Le French MagPi
Tutoriel 4 - opérateurs sur les bits et commandes système
Vous en êtes-vous sortis pour résoudre le problème du mois dernier ? Comparez avec la solution que voici :
Solution du défi
(début de code)
#include <stdio.h> #include <stdlib.h> int newMask() { int mask = (double)rand()/RAND_MAX*254+1; return mask; }
int main(int argc, char *argv[]) { int seed = 0xA3, mask = 0; char c; FILE *inputFile = 0, *outputFile = 0; srand(seed); /* Fixe la valeur de la graine. */
/* Vérifie le nombre d'arguments */ if(argc!=3) { printf(" Utilisation : %s <fichier source> <fichier destination>\n",argv[0]); return 1; /* Signale une erreur */ }
inputFile = fopen(argv[1],"r"); /* Ouvre le fichier source. */ if(!inputFile) return 2;
outputFile = fopen(argv[2],"w"); /* Ouvre le fichier destination. */ if(!outputFile) return 3; c = fgetc(inputFile); /* Lit le premier caractère. */
/* Boucle jusqu'à ce que la fin du fichier soit atteinte. */ while(c != EOF) { mask = newMask(); /* Récupère une valeur pour le nouveau masque. */ printf("mask = %d\n",mask); c ^= mask; /* OU exclusif avec le masque. */ fputc(c,outputFile); /* Écriture dans le fichier destination. */ c = fgetc(inputFile); /* Lit un autre caractère. */ }
/* Ferme les fichiers. */ fclose(inputFile); fclose(outputFile); return 0; }
(fin de code)
La solution met en œuvre un nouveau masque pour chiffrer chaque caractère. Les nombres renvoyés suivent une série, qui est répétée pour une valeur donnée de la graine en entrée. De plus, la clé de chiffrement est la graine aléatoire.