C - Vigenere

Download | Vote Up (0) | Vote Down (0)
/*******************************************************************************
 
   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


Be the first to give feedback !

Please login to comment !