Guest User

Deusexodus

a guest
Dec 1st, 2007
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.29 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <math.h>
  6. #include <ctype.h>
  7. #include "gmp.h"
  8. #include "bibliotheque.h"
  9.  
  10. #define LENGTH_BITS 256 // defini la taille de la cle en bits
  11. #define HYPOTHESIS  45  // a changer car on utilise maintenant le bibliotheque et le centre se trouve etre environ 45 ou 50
  12.  
  13. char *cle_de_codage(char key[500], char *cipher, mpz_t *return_key) {               // retouch� le 27/11/07 (v�rifier sur l'utilisation de **cipher)
  14.     int count = -1 ;
  15.     mpz_t current ;                                             // recuperation de la cle dans cette variable
  16.     mpz_t temp ;                                                // temporaire lors de la creation
  17.     mpz_t zero ;                                                // variable bignum egale a 0
  18.     mpz_t grew ;                                                // variable qui sert �  multiplier ou diviser, current ou temp
  19.  
  20.     mpz_init(zero) ; mpz_init(current) ; mpz_init(temp) ; mpz_init(grew) ; mpz_init(*return_key) ;
  21.  
  22.     while( key[++count] != '\0' ) {
  23.         mpz_add_ui(temp, zero, (unsigned long int)( (int)key[count] ) ) ;
  24.  
  25.         if( mpz_cmp(current, zero) != 0 )
  26.             mpz_mul(current, current, temp) ;
  27.         else
  28.             mpz_set(current, temp) ;
  29.  
  30.         mpz_init(temp) ;
  31.     }                                                   // recuperation des caracteres un par un pour d�finir une valeur directe de la cle
  32.  
  33.     printf("La conversion de %s donne : ", key) ;
  34.     gmp_printf("%Zd\n", current) ;                                      // affichage (juste pour le debug)
  35.  
  36.     mpz_nextprime(current ,current) ;                                   // definition du premier nombre premier suivant a 'current'
  37.  
  38.     printf("Votre cle rotative de %d bits sera donc : ", (int)mpz_sizeinbase(current, 2)) ;
  39.     gmp_printf("%Zd\n", current) ;                                      // affichage [a modifier le type d'affichage et de nommage]
  40.    
  41.     cipher = (char *)malloc(((int)mpz_sizeinbase(current, 10) + 1)*sizeof(char)) ;              // creation de la variable cipher
  42.     cipher = mpz_get_str(cipher, 10, current) ;                                 // variable cipher (tableau de caractere contenant des chiffres)
  43.  
  44.     mpz_add_ui(grew, zero, 10 + (unsigned long int)(cipher[count=0] - '0')) ;               // attribution du "multiplicateur" variant de 10 a 19
  45.  
  46.     while( (int)mpz_sizeinbase(current, 2) < LENGTH_BITS ) {                        // grandissement pseudo-al�atoire
  47.         mpz_set(temp, current) ;
  48.         mpz_add_ui(grew, zero, 10 + (unsigned long int)(cipher[(++count) % strlen(cipher)] - '0')) ;    // cipher genere la pseudo-aleatoirite // ERREUR ???????
  49.         mpz_mul(current, current, grew) ;
  50.     }
  51.  
  52.     mpz_nextprime(current ,current) ;                                   // apres l'adaptation de la taille de la cle au nombre de bit que l'on veut, passage au nombre premier suivant
  53.     printf("La cle de codage de %d bits (en realite de %d) est : \n", LENGTH_BITS, (int)mpz_sizeinbase(current, 2)) ;   gmp_printf("%Zd\n", current) ; // affichage final
  54.  
  55.     mpz_set(*return_key, current) ;
  56.    
  57.     return cipher ;
  58. }
  59.  
  60. void encrypt(char *cipher, mpz_t key, int *bibliotheque) {                          // modification effectuee le 27/11/07
  61.     FILE *input = NULL, *output = NULL ;
  62.     char name_input[20] = "entree.log", name_output[20] = "sortie.log", temp ;
  63.     int count = -1 ;
  64.     unsigned long int result = 0;
  65.     mpz_t resultat ;
  66.    
  67.     mpz_init(resultat) ;
  68.  
  69.     input = fopen(name_input, "r") ;
  70.  
  71.     if(input == NULL)                                           // v�rification de presence de input
  72.         printf("Le fichier d'entree n'est pas present.\n") ;
  73.     else
  74.         printf("Le fichier d'entree est present, poursuite de la procedure.\n") ;
  75.  
  76.     output = fopen(name_output, "w") ;                                  // pas de verification car l'option "w" overwrite s'il existe et le cree sinon
  77.  
  78.     while( (temp = fgetc(input)) != EOF) {                                  // obtention des caracteres pas a pas
  79.         mpz_mod_ui(resultat, key, recherche_bibliographique(temp, bibliotheque)) ;                  // modulo
  80.         gmp_printf("%Zd\n", resultat) ;
  81. //      mpz_add_ui(resultat, resultat, (unsigned long int)(cipher[(++count) % strlen(cipher)] - '0') ) ;    // plus la variable cipher // sens de count et cipher a definir
  82.         gmp_printf("%Zd\n", resultat) ;
  83.         result = passage_bibliographique(mpz_get_ui(resultat), bibliotheque) ;                  // sortie du resultat // chiffrement effectif avec passage par bibliotheque (pour equivalence)
  84.  
  85.         printf("Conversion de : %c en %c.\n", temp, (char)result) ;                     // affichage
  86.         fprintf(output, "%c", (char)result) ;                               // envoi dans le fichier de sortie
  87.     }
  88.     fclose(input) ; fclose(output) ;                                    // fermeture des fichiers l'action de cryptage est terminee
  89. }
  90.  
  91. void decrypt(char *cipher, mpz_t key, int bibliotheque[]) {                             // PARITE NON MISE A JOUR : RECONSTRUCTION EN COURS
  92.     FILE *input = NULL, *output = NULL ;
  93.     char name_input[20] = "sortie.log", name_output[20] = "test.log", temp ;
  94.     int count = 0 ;
  95.     unsigned long int result = 0 ;
  96.     int difference ;
  97.     mpz_t resultat ;
  98.  
  99.     mpz_init(resultat) ;
  100.     input = fopen(name_input, "r") ;
  101.  
  102.     if(input == NULL)                                           // test de presence du fichier d'entree
  103.         printf("Le fichier d'entree n'est pas present.\n") ;
  104.     else
  105.         printf("Le fichier d'entree est present, poursuite de la procedure.\n") ;
  106.  
  107.     output = fopen(name_output, "w") ;                                  // creation du fichier de sortie
  108.  
  109.     while( (temp = fgetc(input)) != EOF) {                                  // meme fonctionnement que encrypt initialement
  110.         mpz_mod_ui(resultat, key, recherche_bibliographique(HYPOTHESIS, bibliotheque)) ;
  111.         mpz_add_ui(resultat, resultat, (unsigned long int)(cipher[(++count) % strlen(cipher)] - '0')) ;
  112.         result = passage_bibliographique(mpz_get_ui(resultat), bibliotheque) ;
  113.  
  114.         difference = (int)temp - (int)result ;                              // cas qui differe avec la difference
  115.  
  116.         printf("Conversion de : %c en %c.\n", temp, (char)(HYPOTHESIS + difference)) ;
  117.         fprintf(output, "%c", (char)(HYPOTHESIS + difference) ) ;                   // si pas trop valable rajoute une boucle de verification qui fera du proche en proche
  118.     }
  119.     fclose(input) ; fclose(output) ;                                    // fermeture des fichiers : tous les caracteres ont ete lus
  120. }
  121.  
  122. int main(void) {
  123.     char *cipher, init_key[500], done = 0 ;
  124.     mpz_t key ;
  125.     int choice, state_biblio, *bibliotheque ;
  126.  
  127.     printf("Veuillez entrer votre cle de cryptage (cle forte) : ") ;
  128.     fgets(init_key, sizeof(init_key), stdin) ; init_key[strlen(init_key)-1] = '\0' ;
  129.  
  130.     cipher = cle_de_codage(init_key, cipher, &key) ;
  131.     bibliotheque = create_bibliotheque(bibliotheque) ;
  132.    
  133.     if(state_biblio == 1)
  134.         done = 1 ;                                          // faudra rajouter les printf pour montrer l'erreur
  135.  
  136.     while(choice != 3 && done == 0) {
  137.         printf( "+---------------------------------------------------+\n"
  138.                 "|                                                   |\n"
  139.                 "|  Veuillez choisir une action a effectuer :        |\n"
  140.                 "|                                                   |\n"
  141.                 "+---------------------------------------------------+\n"
  142.                 "|                                                   |\n"
  143.                 "|  1) Encrypter un texte avec la cle de codage      |\n"
  144.                 "|  2) Decrypter le texte avec la cle de codage      |\n"
  145.                 "|  3) Ne rien faire (habeas corpus)                 |\n"
  146.                 "|                                                   |\n"
  147.                 "+---------------------------------------------------+\n") ;
  148.         printf("Choix : ") ;
  149.         scanf("%d", &choice) ;
  150.  
  151.         switch(choice) {
  152.             case 1 : encrypt(cipher, key, bibliotheque) ;
  153.                    done = 1 ;
  154.                    break ;
  155.  
  156.             case 2 : decrypt(cipher, key, bibliotheque) ;
  157.                    done = 1 ;
  158.                    break ;
  159.  
  160.             case 3 : break ;
  161.  
  162.             default : printf("Vous avez du vous tromper ! Retappez votre saisie.\n") ;
  163.                   break ;
  164.         }
  165.     }
  166.     return 0 ;
  167. }
  168.  
  169.  
Advertisement
Add Comment
Please, Sign In to add comment