Cryptage (2)
Un exemple complet en C

Maintenant un programme de cryptage legerement plus complexe (écrit en C). Le principe est assez simple, on remplace la fonction XOR par une addition qui change à chaque fois (on en utilisera 3).

Pour le cryptage on lit un octet du fichier et suivant sa position, on lui ajoute la clef, un nombre au hasard ou la clef + hasard.

Pour le décryptage on lit un octet du fichier et suivant sa position, on lui soustrait la clef, un nombre au hasard ou la clef + hasard.

Le programme

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>

// ---- Déclaration des fonctions définies plus bas ----
void lecture( char lire[128] ) ;
void crypter( char crypt[128] ) ;
void decrypter( char decrypt[128] ) ;

// ----Programme principal ----
main()
{
  char fichier[128] ;
  int choix = 0 ;
  char continu = 1 ;

  // ---- Saisie du fichier avec son chemin ----
  printf( "\nFichier : " ) ;
  scanf( "%s" , &fichier ) ;

  // ---- Boucle principale ----
  while ( continu == 1 )
  {
    clrscr() ;
    printf( "\nExemple Cryptage" ) ;
    printf( "\n\nfichier : %s",fichier ) ;
    printf( "\n\nFonctions :" ) ;
    printf( "\n\n(1) Lire le fichier" ) ;
    printf( "\n(2) Cryptage" ) ;
    printf( "\n(3) Decryptage" ) ;
    printf( "\n(4) Exit" ) ;
    printf( "\n\nChoix : " ) ;
    choix = getchar() ;

    // ---- On lance la fonction choisie ----
    switch (choix)
    {
      case 49 :
        lecture( fichier ) ;
      break;
      case 50 :
        crypter( fichier ) ;
      break;
      case 51 :
       decrypter( fichier ) ;
      break;
      case 52 :
        continu = 0 ;
      break;
    }
    printf( "\n" ) ;
  }
  printf( "\n\nRetour au dos\n" ) ;
}

////////////////////////////////////////////////////////
// Les fonctions
////////////////////////////////////////////////////////

// ---- Fonction d'affichage du fichier ----
void lecture( char lire[128] )
{
  char compteur_car ;
  char compteur_ligne ;
  char car_lect ;
  FILE *fp_lect ;

  // ---- Ouverture du fichier en lecture ----
  fp_lect = fopen( lire , "r" ) ;
  compteur_car = 0 ;
  compteur_ligne = 0 ;
  clrscr() ;
  printf ( "Lecture du fichier\n\n" ) ;

  // ---- On affiche le fichier par écrans de 17 lignes ----
  while ( ( car_lect = fgetc( fp_lect ) ) != EOF )
  {
    compteur_car ++ ;
    printf( "%c" , car_lect ) ;
    if ( car_lect == 10 )
    {
      compteur_car = 0 ;
      compteur_ligne ++ ;
    }
    if ( compteur_car >= 80 )
    {
      compteur_car = 0 ;
      compteur_ligne ++ ;
    }
    if ( compteur_ligne >= 17 )
    {
      compteur_car = 0 ;
      compteur_ligne = 0 ;
      printf( "\n<Press Key>\n" ) ;
      car_lect = getch() ;
      clrscr() ;
      printf ( "Lecture du fichier\n\n" ) ;
    }
  }

  // ---- Fermeture du fichier ----
  fclose( fp_lect ) ;
}

// ---- Fonction de cryptage ----

void crypter( char crypt[128] )
{
  int car1 ;
  int code1 ;
  int hasard1 ;
  int tmp1 ;
  char cmpt1 ;
  FILE *fp1 ;
  FILE *fp1_tmp ;

  // ---- On demande une clef ----
  printf( "\n\nClef (0-2^16) : " ) ;
  scanf( "%i" , &code1 ) ;

  // ---- On initialise le générateur aléatoire et on prend une valeur au hasard ----
  time( &tmp1 ) ;
  srand( tmp1 ) ;
  tmp1 = hasard1 / 256 ;
  hasard1 = hasard1 - (256 * tmp1);

  // ---- Ouverture du fichier en lecture ----
  fp1 = fopen( crypt , "r" ) ;

  // ---- Ouverture du fichier file.tmp en écriture ----
  fp1_tmp = fopen( "file.tmp" , "w" ) ;

  // ---- On sauve hasard dans le fichier pour le décryptage ----
  fputc( hasard1 , fp1_tmp ) ;
  cmpt1 = 0 ;

  while ( ( car1 = fgetc( fp1 ) ) != EOF )
  {
    cmpt1 ++ ;

    // ---- On additionne selon le compteur 'cmpt1' ----
    switch (cmpt1)
    {
      case 1 :
        car1 = car1 + code1 ;
      break;
      case 2 :
        car1 = car1 + hasard1 ;
      break;
      case 3 :
        car1 = car1 + hasard1 +code1 ;
        cmpt1 = 0 ;
      break;
    }

    // ---- On remet 'car1' entre 0 et 255 (valeur min et max d'un octet) et on le sauve dans 'file.tmp' ----
    tmp1 = car1 / 256 ;
    car1 = car1 - (256 * tmp1);
    fputc( car1 , fp1_tmp ) ;
  }

  // ---- Fermeture des fichiers et on renomme le fichier .tmp ----
  fclose( fp1_tmp ) ;
  fclose( fp1 ) ;
  remove( crypt ) ;
  rename( "file.tmp" , crypt ) ;
  printf( "\nCryptage terminer\n" ) ;
  getch() ;
}

// ---- Fonction de décryptage ----

void decrypter( char decrypt[128] )
{
  int car2 ;
  int code2 ;
  int hasard2 ;
  int tmp2 ;
  char cmpt2 ;
  FILE *fp2 ;
  FILE *fp2_tmp ;

  // ---- On demande une clef ----
  printf( "\n\nClef (0-2^16) : " ) ;
  scanf( "%i" , &code2 ) ;

  // ---- Ouverture des fichiers ----
  fp2 = fopen( decrypt , "r" ) ;
  fp2_tmp = fopen( "file.tmp" , "w" ) ;

  // ---- On lit la valeur prise au hasard au cryptage ----
  hasard2 = fgetc( fp2 ) ;
  while ( ( car2 = fgetc( fp2 ) ) != EOF )
  {
    cmpt2 ++ ;

    // ---- On soustrait selon le compteur 'cmpt2' ----
    switch (cmpt2)
  {
    case 1 :
      car2 = car2 - code2 ;
    break;
    case 2 :
      car2 = car2 - hasard2 ;
    break;
    case 3 :
      car2 = car2 - hasard2 - code2 ;
      cmpt2 = 0 ;
    break;
    }

    // ---- On remet 'car2' entre 0 et 255 (valeur min et max d'un octet) et on le sauve dans 'file.tmp' ----
    if ( car2 < 0 )
      car2 = 0 - car2 ;
    tmp2 = car2 / 256 ;
    car2 = car2 - (256 * tmp2);
    fputc( car2 , fp2_tmp ) ;
  }

  // ---- Fermeture des fichiers et on renomme le fichier .tmp ----
  fclose( fp2_tmp ) ;
  fclose( fp2 ) ;
  remove( decrypt ) ;
  rename( "file.tmp" , decrypt ) ;
  printf( "\nDecryptage terminer\n" ) ;
  getch() ;
}


Maintenant à vous de jouer !


Tutoriaux - Cryptage (2) - Photographies, projects informatiques et tutoriaux de programmation.
Chandelier Japonais - Annonce immobilière maison - Sellette occasion - Logiciel de rendez-vous - Velo route occasion - Chat sans inscription - Masque - Pic petrolier