/*------------------------------------------------------------------------*
 *                     Crypte.c                SOURCE C                   *
 *                     ~~~~~~~~                ~~~~~~~~                   *
 *------------------------------------------------------------------------*/


/*------------------------------------------------------------------------*/

#include <stdio.h>

/*------------------------------------------------------------------------*/

FILE  *fp1 , *fp2;
int   i;
char  CleCodage[256];
void  TmtCle(char *);
char  NomOutput[128] , *PtrNomOutput = NomOutput;
char  Buffer, Convert;

/*------------------------------------------------------------------------*/
void CopyRight(void)
{
 printf("\n"\
        " /\\/\\/\\/\\/\\/\\/\\\n"\
        "/  Crypte     /  V1.0 AUTEUR : LECLERCQ XAVIER\n"\
        "\\/\\/\\/\\/\\/\\/\\/                 Vieux chemin d'ath n°12\n"\
        "                               B-7548 Warchin BELGIQUE\n"\
        "\n");
}
/*------------------------------------------------------------------------*/
void Aide(void)
{
 printf("\n"\
        "USAGE :  Crypte    NomDuFichier {D,C} CLE\n"\
        "~~~~~\n"\
        "EXEMPLE: Crypte    FichierEntree C MARYLINE\n"\
        "~~~~~~~\n"\
        "\tMARYLINE est l'encryption key c'est à dire la clé de codage.\n"\
        "\tFichierEntree est le nom du fichier contenant le texte à coder.\n"\
        "\tAvec   C  pour CRYPTER   le texte\n"\
        "\t       D  pour DECRYPTER le texte\n\n"\
        "-> Le fichier résultant d'un CODAGE portera le nom fichierEntree"\
        ".COD\n"\
        "-> Le fichier résultant d'un DECODAGE portera le nom du fichier"\
        "Entree\n   d'origine : Crypte    supprimera l'extension .COD\n\n"\
        "ATTENTION le texte en entrée doit être composé UNIQUEMENT de "\
        "lettres \nMAJUSCULES composant l'alphabet (A..Z) et d'espaces.\n"\
        "Idem pour la clé de codage : la clé 'MARYLINE' est correcte\n"\
        "                     MAIS  : la clé 'MaryLine' est incorrecte !"\
        "\n");
 exit(0);
}
/*------------------------------------------------------------------------*/
void Crypte(char *NomInput,char *Cle)
{
 TmtCle(Cle);

 fp1 = NULL , fp2 = NULL;

 strcpy(PtrNomOutput,NomInput);
 strcat(PtrNomOutput,".COD"); 

 if(!(ferror(fp1=fopen(NomInput,"rb")))) 
 {
   if(!(ferror(fp2=fopen(NomOutput,"wb")))) 
   {
     printf("\n\n>>> CRYPTE ...  \n\n");
     fread(&Buffer,1,1,fp1);
     i = 0;
     while(!(feof(fp1)))
     {
       if (Buffer != ' ' & Buffer != 0x0a & \
           Buffer != 0x0d & ( Buffer < 65 | Buffer > 90) )
         printf("\n\tERREUR : lettre différente de A..Z (+ espace)\n"\
                "\t~~~~~~\n\n"),fclose(fp1),fclose(fp2),exit(0);
       else 
       {
         if (Buffer == 0x20)
           Convert = 0x00;
         else
           Convert  = Buffer - 64;
         Convert += CleCodage[i++];
         Convert %= 27;
         if (i > (strlen(Cle) - 1)) i = 0;
         if (Buffer != 0x0a & Buffer != 0x0d)
           Buffer = Convert + 64;
         fwrite(&Buffer,1,1,fp2);
       }
       fread(&Buffer,1,1,fp1);
     }
     fclose(fp2);
   }
   else 
     printf("\n\tERREUR : erreur d'ouverture du fichier en sortie...\n"\
            "\t~~~~~~\n\n");
   fclose(fp1);
 }
 else 
   printf("\n\tERREUR : erreur d'ouverture du fichier en entrée...\n"\
          "\t~~~~~~\n\n");
printf("\n>>> OK ...  \n\n");
}
/*------------------------------------------------------------------------*/
void DeCrypte(char *NomInput,char *Cle)
{
 TmtCle(Cle);

 fp1 = NULL , fp2 = NULL;

 strcpy(PtrNomOutput,NomInput);
 NomOutput[strlen(PtrNomOutput)-4] = 0x00;

 if(!(ferror(fp1=fopen(NomInput,"rb")))) 
 {
   if(!(ferror(fp2=fopen(NomOutput,"wb")))) 
   {
     printf("\n\n>>> DECRYPTE ...  \n\n");
     fread(&Buffer,1,1,fp1);
     i = 0;
     while(!(feof(fp1)))
     {
       Convert  = Buffer - 64 + 27;
       Convert -= CleCodage[i++];
       Convert %= 27;
       if (i > (strlen(Cle) - 1)) i = 0;
       if (Buffer != 0x0a & Buffer !=0x0d )
       {
         if (Convert == 0)
           Buffer = 0x20;
         else
           Buffer = Convert + 64;
       }
       fwrite(&Buffer,1,1,fp2);
       fread(&Buffer,1,1,fp1);
     }
     fclose(fp2);
   }
   else 
     printf("\n\tERREUR : erreur d'ouverture du fichier en sortie...\n"\
            "\t~~~~~~\n\n");
   fclose(fp1);
 }
 else 
   printf("\n\tERREUR : erreur d'ouverture du fichier en entrée...\n"\
          "\t~~~~~~\n\n");
printf("\n>>> OK ...  \n\n");
}
/*------------------------------------------------------------------------*/
void TmtCle(char *Cle)
{
 for ( i = 0 ; i < strlen(Cle) ; i++)
 {
   if (Cle[i] < 65 | Cle[i] > 90) 
     printf("\n\tERREUR : lettre de la clé différente de A..Z\n"\
            "\t~~~~~~\n\n"),exit(0);
   else
     CleCodage[i] = Cle[i] - 64;
 }
}
/*------------------------------------------------------------------------*/
void main(int argc, char *argv[])
{
  CopyRight();
  (argc < 4) ? Aide() : printf("\n\n>>> Charge fichier %s\n",argv[1]);
  if ( *argv[2] == 'C' | *argv[2] == 'c' ) Crypte(argv[1],argv[3]);
  else if ( *argv[2] == 'D' | *argv[2] == 'd' ) DeCrypte(argv[1],argv[3]); 
        else Aide();
}
/*------------------------------------------------------------------------*/
