Calcul d'une clé privée RSA

Calcul d'une clé privée RSA - Algo - Programmation

Marsh Posté le 18-01-2010 à 17:04:21    

Bonjour à tous, dans un programme je doit utiliser un cryptage RSA donc les clés seront générées depuis un mot de passe
Je n'en suis qu'au début mais je rencontre d'hors et déjà un problème lors de la définition des clés, en fonction des chiffres entrés au début (qui par la suite seront calculés par un autre algo) il est parfois impossible de définir une clé privée
Voici mon code:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int pgcd(int a, int b)
  4. {
  5.   int k = 1, d = 1;
  6.   for (k = 1; k <= a && k <= b; k++)
  7.     if (a % k == 0 && b % k == 0)
  8.       d = k;
  9.   return d;
  10. }
  11. int main()
  12. {
  13.     printf("Lancement du programme\n" );
  14.     int p=35422;
  15.     printf("p=%d\n", p);
  16.     int q=38877;
  17.     printf("q=%d\n", q);
  18.     int n=p*q;
  19.     printf("n=%d\n", n);
  20.     int f=(p-1)*(q-1);
  21.     printf("f=%d\n", f);
  22.     int i=0;
  23.     int PGCD1=0;
  24.     int e=0;
  25.     if(p>q)
  26.     {
  27.         e=p-1;
  28.     }
  29.     else
  30.     {
  31.         e=q-1;
  32.     }
  33.     while(PGCD1 != 1)
  34.     {
  35.         while(i==0)
  36.             if(p<e && q<e && e<f)
  37.             {
  38.                 i=1;
  39.             }
  40.             else
  41.             {
  42.                 e++;
  43.             }
  44.         PGCD1 = pgcd(e, f);
  45.         if(PGCD1!=1)
  46.         {
  47.             e++;
  48.         }
  49.     }
  50.     printf("e=%d\n", e);
  51.     int d=0;
  52.     i=0;
  53.     if(p>q)
  54.     {
  55.         d=p-1;
  56.     }
  57.     else
  58.     {
  59.         d=q-1;
  60.     }
  61.     while(i==0&&d<f)
  62.     {
  63.         if(e*d%f==1 && p<d && q<d && d<f)
  64.         {
  65.             i=1;
  66.         }
  67.         else
  68.         {
  69.             d++;
  70.         }
  71.     }
  72.     if(i==1)
  73.     {
  74.         d=d-1;
  75.         printf("d=%d", d);
  76.     }
  77.     else
  78.     {
  79.         printf("Impossible de definir une cle privee" );
  80.     }
  81.     return 0;
  82. }


 
En lançant ce programme tout ce passe bien et la console affiche:

Code :
  1. Lancement du programme
  2. p=35422
  3. q=38877
  4. n=1377101094
  5. f=1377026796
  6. e=38879
  7. d=596684466


 
Si par contre à la ligne 16 je remplace la valeur de p par "35422" la console affiche

Code :
  1. Lancement du programme
  2. p=35472
  3. q=38877
  4. n=1379044944
  5. f=1378970596
  6. e=38879
  7. Impossible de definir une cle privee


 
Cela vient t'il d'une erreur dans mon code?
Est-ce un problème connu et y a t'il une méthode simple pour l'éviter?
Ou dois-je redéfinir p chaque fois qu'aucune clé privée ne peux être générée?
 
Merci d'avance pour vos réponses
 
Nico-teeN

Reply

Marsh Posté le 18-01-2010 à 17:04:21   

Reply

Marsh Posté le 19-01-2010 à 11:58:20    

On m'a signalé sur un autre forum que p et q devaient être des nombres premiers, le problème à donc été résolu par l'ajout des fonctions suivantes

Code :
  1. int test_nombre_premier(int a)
  2. {
  3.   int i;
  4.   int compter;
  5.   int test;
  6.   test = compter = 0;
  7.   for (i = 2; i < a; i++, compter++)
  8.     if (a % i == 0)
  9.       test = 1;
  10.   if (!test)
  11.     return 1;
  12.   else
  13.     return 0;
  14. }
  15. int transfo_premier(int a)
  16. {
  17.     int i=0;
  18.     while(i==0)
  19.     {
  20.         if(test_nombre_premier(a))
  21.             i=1;
  22.         else
  23.             a++;
  24.     }
  25.     return a;
  26. }


 
ainsi que des lignes

Code :
  1. p=transfo_premier(p);
  2. et
  3.     q=transfo_premier(q);


Juste après la définition de p et q
 
Merci toute fois à ceux qui ont lu ce message dans l'espoir de m'apporter leur aide :)
 
Reste le problème du calcul de d, qui est déjà affreusement long et le sera bien trop lorsque j'utiliserais de grand chiffres
 
Si quelqu'un à une idée pour calculer d sachant e*d%n=1 et p,q<d<f je suis preneur car la je suis un peu paumé
 
Edit: Second problème résolu grace à l'algorithme d'euclide étendu


Message édité par Nico-teeN le 19-01-2010 à 20:01:27
Reply

Sujets relatifs:

Leave a Replay

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