Cryptage RSA

Cryptage RSA - Algo - Programmation

Marsh Posté le 14-05-2009 à 22:29:02    

Salut à tous.
Dans le but de réaliser un cryptage d'une chaine de caractère avec RSA,
voici les 2 fonctions principales qui permettent de crypter un fichier source.
 

Code :
  1. // ********************* CRYPTAGE *********************  
  2. void crypter()
  3. {
  4.      FILE *source_crypt;
  5.      FILE *res_crypt;
  6.    
  7.      unsigned char c;
  8.      unsigned long int i=0;
  9.      unsigned long int k,n,e;
  10.      char nom_fichier[20];
  11.    
  12.      printf("\n\n\t\t\t *********\n" );
  13.      printf("\t\t\t *CRYPTAGE*\n" );
  14.      printf("\t\t\t *********\n\n\n\n" );
  15.    
  16.      fflush(stdin);
  17.    
  18.      printf("Donner le nom du fichier source avec son extension : " );
  19.      gets(nom_fichier);
  20.    
  21.      printf("\n\n\n\tdonner votre cle publique n : " );
  22.      scanf("%d",&n);
  23.    
  24.      printf("\n\n\n\tdonner votre cle publique e : " );
  25.      scanf("%d",&e);
  26.  
  27.      source_crypt=fopen(nom_fichier,"rb" );
  28.      if(source_crypt==NULL)
  29.      {
  30.      printf("Impossible d'ouvrir le fichier source.\n" );
  31.      }
  32.    
  33.      res_crypt=fopen("result.cry" , "wb" );
  34.      if(res_crypt==NULL)
  35.      {
  36.      printf("Impossible d'ouvrir le fichier resultat.\n" );
  37.      }
  38.      system("cls" );
  39.      printf("\n\n\t\tATTENDEZ SVP PENDANT LE CRYPTAGE." );
  40.    
  41.      while((feof(source_crypt)==0) && (fread(&c,sizeof(unsigned char),1,source_crypt)!=0))
  42.      {
  43.      fseek(source_crypt,sizeof(unsigned char)*i,SEEK_SET);
  44.      fread(&c,sizeof(unsigned char),1,source_crypt);
  45.      k=crypt(c,n,e);
  46.      fwrite(&k,sizeof(unsigned long int),1,res_crypt);
  47.      i=i+1;
  48.      }
  49.    
  50.      fclose(source_crypt);
  51.      fclose(res_crypt);
  52.      printf("\n\n\n\n\n\n\n\n\n\nLe cryptage de votre fichier est termine." );
  53.      printf("\n\nvotre fichier crypter se nomme result.cry" );
  54.      getch();
  55.    
  56. }
  57. // ********************* FONCTION CRYPTAGE ***********************
  58. unsigned long int crypt(unsigned char k,unsigned long int n,unsigned long int e)
  59. {
  60.      unsigned long int i,res=1,nbre;
  61.      nbre=((unsigned long int)k);
  62.    
  63.      for(i=0;i<e;i++)
  64.      {
  65.      res = res * nbre;
  66.      res=fmod(res,n);
  67.      }
  68.    
  69.      return res;
  70. }


 
Dans un 1er temps je n'ai pas besoin d'une "usine à gaz" comme celle ci.
Je souhaiterai d'abord crypter en RSA caractère par caractère (ASCII)
Dans un 2ème temps comment utiliser l'exponentiation modulaire
 
Merci

Reply

Marsh Posté le 14-05-2009 à 22:29:02   

Reply

Marsh Posté le 15-05-2009 à 09:28:55    

Déjà on dit pas crypter mais chiffrer ...
Dans un premier temps, je te conseille de te documenter sur l'algo RSA. En principe dans RSA on ne chiffre pas caractère par caractère, mais plutôt par bloc (de n bits).
Ensuite, dans un second temps, je te conseille de chercher sur internet une librairie de chiffrement (regarde peut-être du coté de OpenSSL, sauf c'est trop uzineagazesque pour ton besoin) ou alors de coder toi même ton implémentation qui répondra à ton besoin sur mesure.


---------------
By bob.
Reply

Marsh Posté le 15-05-2009 à 10:14:22    

Ok superbob mais alors par quel commande je pourrais segmenter une chaine de caractère par des bloc de n bits.
Je me suis assez documenter sur cette méthode de "chiffrement" cependant je n'ai pas trouvé les commandes en C associées.
Merci d'avance ;)

Reply

Marsh Posté le 15-05-2009 à 10:16:18    

Hamy, si tu trouves que ta fonction crypt() est une usine à gaz, t'as pas vu le code source d'un algo RSA!!! C'est bien plus compliqué que ça. Et la plupart des algos de chiffrage travaiellent effectivement sur des blocs de bits et non caractère par caractère, sinon, une cryptanalyse te fait sauter ton chiffrage en 2 secondes :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 15-05-2009 à 10:29:09    

Oui c'est vrai mon prof d'info m'a parlé de ceci.
Admettons:
L'utilisateur saisit une chaine de caractère.
Cette chaine est alors segmenté par des blocs de 2bits
Avec quel commande je peux segmenté cette chaine en bloc de n bits?

Reply

Marsh Posté le 15-05-2009 à 12:24:08    

un pointeur ?
 


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 15-05-2009 à 14:38:14    

Hamy a écrit :

Ok superbob mais alors par quel commande je pourrais segmenter une chaine de caractère par des bloc de n bits.
Je me suis assez documenter sur cette méthode de "chiffrement" cependant je n'ai pas trouvé les commandes en C associées.
Merci d'avance ;)


Je te conseille vraiment de regarder du côté OpenSSL qui est doit surement te permettre d'arriver à tes fins. Par contre ça risque d'être assez long et compliqué à utiliser parce que OpenSSL c'est pas un petit projet ...
Mais pour ton problème de segmenter une chaîne de caractères en n bits, eh bien ça dépends, si tu résonne à base d'octet, c'est facile car un caractère = 1 octet, donc le découpage est simple (tu découpe ta chaîne en bloc de n caractères), par contre si tu veux avoir des bloc de 5 ou 7 bits (par exemple) c'est plus compliqué (faut faire du décalage de bit et tout ce genre de truc bien relou)...
 
EDIT: il n'y a pas de méthode 'magique' pour découper une chaîne en bloc de 2 bits. Déjà il faut segmenter en caractères (comme 8 est multiple de 2 c'est possible) puis utiliser les opérateurs de décalage de bits et ET binaires pour récupérer les 2 bits qu'il faut. Mais dans ton cas je pense que ce n'est pas du tout ce qu'il faut faire.


Message édité par superbob56 le 15-05-2009 à 14:41:43

---------------
By bob.
Reply

Marsh Posté le 15-05-2009 à 20:38:47    

des blocs de 2 à 8 bits, ça me paraît pas beaucoup...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed