/******************************************************************************* ENCODAGE VIGENERE Texte clair: CECI EST UN TEST C *1* -> P *2* -> R (*1*,*2*) E *1* -> A *2* -> E (*1*,*2*) Clé PASSWORD Texte crypte REUA AGK XC TWKP --------------- Message clair --------------------- A B C D E F G H I J K L M N O P Q R S T U V W X Y Z *1* | A A B C D E F G H I J K L M N O P Q R S T U V W X Y Z | B B C D E F G H I J K L M N O P Q R S T U V W X Y Z A | C C D E F G H I J K L M N O P Q R S T U V W X Y Z A B | D D E F G H I J K L M N O P Q R S T U V W X Y Z A B C E E F G H I J K L M N O P Q R S T U V W X Y Z A B C D M F F G H I J K L M N O P Q R S T U V W X Y Z A B C D E o G G H I J K L M N O P Q R S T U V W X Y Z A B C D E F t H H I J K L M N O P Q R S T U V W X Y Z A B C D E F G I I J K L M N O P Q R S T U V W X Y Z A B C D E F G H d J J K L M N O P Q R S T U V W X Y Z A B C D E F G H I e K K L M N O P Q R S T U V W X Y Z A B C D E F G H I J L L M N O P Q R S T U V W X Y Z A B C D E F G H I J K p M M N O P Q R S T U V W X Y Z A B C D E F G H I J K L a N N O P Q R S T U V W X Y Z A B C D E F G H I J K L M s O O P Q R S T U V W X Y Z A B C D E F G H I J K L M N s P P Q R S T U V W X Y Z A B C D E F G H I J K L M N O e Q Q R S T U V W X Y Z A B C D E F G H I J K L M N O P R R S T U V W X Y Z A B C D E F G H I J K L M N O P Q | S S T U V W X Y Z A B C D E F G H I J K L M N O P Q R | T T U V W X Y Z A B C D E F G H I J K L M N O P Q R S | U U V W X Y Z A B C D E F G H I J K L M N O P Q R S T | V V W X Y Z A B C D E F G H I J K L M N O P Q R S T U | W W X Y Z A B C D E F G H I J K L M N O P Q R S T U V | X X Y Z A B C D E F G H I J K L M N O P Q R S T U V W | Y Y Z A B C D E F G H I J K L M N O P Q R S T U V W X | Z Z A B C D E F G H I J K L M N O P Q R S T U V W X Y *2* \******************************************************************************/ // Les bibliothèques classiques... #include <stdio.h> // printf #include <string.h> // strlen, strncmp, strncpy // ceci est une définition qui fait appel à des fonctions en C/C++ #define test_flux if(!src || !dest) { printf("\nImpossible d'acceder au fichier."); return; } // Des "define" classiques... juste pour information, inutiles en C++ pas en C #define bool int #define true 1 #define false 0 //---- Matrice de vigenère char MatriceVigenere[26][26]; //---- Entete de la fontion decrypte_VIGENERE void InitMatrice() { int i,j; for(i=0;i<26;i++) { for(j=0;j<26;j++) { MatriceVigenere[i][j]=(char)(((i+j)%26)+65); // 'A' = 0x41 = 65 } } } //---- Entete de la fontion decrypte_VIGENERE void decrypt_VIGENERE(char filename[256],char filedest[256],char *password) { int rep,i=0,decode,j; // rep pour la lecture d'un octet, i pour indexer les // caractères du mot de passe, decode = rep decode FILE *src,*dest; /*---------------------------------------------------------------------------------------------------- * rb read binary lecture binaire, lit tout les octets * wb write binary écriture binaire, écrit par octet * ab append binary ajout binaire, ouvre un fichier en écritre sans l'écraser * r+b read and update binary mise à jour en mode binaire : peut lire et écrire dans le fichier * rt read text lecture en mode texte 0x01 > non lu * wt write text écriture en mode texte 0x01 > non écris * at append text ajout en mode texte * r+t read and update text mise à jour en mode texte : peut lire et écrire dans le ficheir * */ src=fopen(filename,"rb"); // on ouvre le fichier en lecteure binaire // pour les fichiers contenant des caractères // non lisibles dest=fopen(filedest,"wb"); // de même en écriture test_flux; // on appelle le define pour voir si l'un des deux flux de // fichier est NULL ou non, s'il est NULL (=0) c'est que // l'accès au fichier ne s'est pas fait // tant que (rep = lire_un_octet_dans_le_fichier_de_flux(flux)) != EOF) // EOF = fin de fichier // tant qu'on est pas à la fin du fichier, mettre l'octet dans rep while( (rep=fgetc(src)) !=EOF ) { // écrire_octet(rep_décodé, dans_fichier_destination); // écrire le caractère lu (donc "rep") le coder avec le mot de passe // dans le flux destination // rep_décodé = rep - password[i modulo longueur_du_mot_de_passe] // // 0 modulo 4 = 1 // 1 modulo 4 = 1 // 2 modulo 4 = 2 // 3 modulo 4 = 3 // 4 modulo 4 = 0 // 5 modulo 4 = 1 // 6 modulo 4 = 2 // 7 modulo 4 = 3 // 8 modulo 4 = 0 // 9 modulo 4 = 1 // if( rep >= 'a' && rep <= 'z') rep -= 0x20; // 'a' - 0x20 = 'A' if( password[i] >= 'a' && password[i] <= 'z') password[i] -= (char)0x20; if( rep >= 'A' && rep <= 'Z' ) { for( j = 0 ; j < 26 ; j++ ) { if( MatriceVigenere[password[i]-'A'][j] == rep ) { decode = MatriceVigenere[0][j]; break; } } } else { decode=rep; } fputc(decode,dest); if( rep >= 'A' && rep <= 'Z' ) i = (i + 1) % strlen(password); } // On ferme le flux des fichiers "source" et "dest" fclose(src); fclose(dest); } //---- Entete de la fontion decrypte_VIGENERE /* La procédure est la même à la seul et unique différence est que "rep" * est codé de la manière opposé à la manière ci-dessus : * rep_décodé = rep + password[i modulo longueur_du_mot_de_passe] * */ void crypt_VIGENERE(char filename[256],char filedest[256],char *password) { FILE *src,*dest; src=fopen(filename,"rb"); dest=fopen(filedest,"wb"); test_flux; int rep,i=0,code,indice; while( (rep=fgetc(src)) !=EOF ) { if( rep >= 'a' && rep <= 'z') rep -= 0x20; // 'a' - 0x20 = 'A' if( password[i] >= 'a' && password[i] <= 'z') password[i] -= (char)0x20; indice=(password[i]-'A'+1)%26; code = MatriceVigenere[indice][rep-'A']; if( !( rep >= 'A' && rep <= 'Z' ) ) code=rep; fputc(code,dest); if( rep >= 'A' && rep <= 'Z' ) i = (i + 1) % strlen(password); } fclose(src); fclose(dest); } //-- Synopsis ------------------------------------------------------------------ void usage() { printf("\nConvertisseur Vigenere/Cesar v1.0" "\n---------------------------------\n" "\nVC input_file output_file password -e|-d" "\n " "\n-e : encodage en cesar/vigenere " "\n-d : decodage en cesar/vigenere " "\nEncodage d'un fichier ............: VC test.txt code.txt pass -e" "\nDecodage d'un fichier ............: VC code.txt decode.txt pass -d" "\nL'encodage de Vigenere est presque identique a celui de Cesar a la" "\ndifference pres que la methode de Cesar n'utilise qu'un caractere " "\n(une lettre) en mot de passe\n" "\nCe programme peut encoder/decoder un fichier binaire, meme si cet " "\nalgorithme n'est initialement pas prevu a cet effet.\n"); } int main(int argc, char *argv[]) { char option[2]="\0"; char fichier_src[256]; char fichier_dst[256]; char str_motdepasse[256]; if(argc!=5) // Si le nombre d'arguments est différent de 5 { // dir /b c:\ --> 2 arguments : "/b" et "c:\" usage(); // return(1); } InitMatrice(); strncpy(fichier_src,argv[1],256); // copie au maximum 256 caractères strncpy(fichier_dst,argv[2],256); // du paramètre entré n°1, 2 et 3 strncpy(str_motdepasse,argv[3],256); // strncpy(option,argv[4],2); // // Si l'option est "-e" alors on encode if( !strncmp("-e",option,2) ) { printf("Crypting.....: %s -> %s -> %s",fichier_src,str_motdepasse,fichier_dst); // Appel de la fonction d'encodage (cryptage) crypt_VIGENERE(fichier_src,fichier_dst,str_motdepasse); } else { // Si l'option est "-d" alors on décode if( !strncmp("-d",option,2) ) { printf("Decrypting...: %s -> %s -> %s",fichier_src,str_motdepasse,fichier_dst); // Appel de la fonction de décodage (décryptage) decrypt_VIGENERE(fichier_src,fichier_dst,str_motdepasse); } else { // Autrement le dernier paramètre entré n'est pas bon et on montre // l'aide en quittant le programme usage(); return(2); } } // (Dé)Cryptage termine printf("...done.\n"); return(0); }
saelyx