code ça marche mais se n'est pas une bonne execution

code ça marche mais se n'est pas une bonne execution - C++ - Programmation

Marsh Posté le 14-03-2012 à 15:34:29    

salut,
j'ai un grand besoin d'aide si quelqu'un a déja travailler sur le RSA et qu'il peut me guider je l'en remercie. [#ff0000][/#ff0000]
j'ai executer ce code mais ça ne génére pas les bonne clés.
POur info le fonctionnement et le suivant :
1. choisir p et q deux nombres premiers.
2. calculer n = p * q
3. calculer l'indicatrice d'Euler phi = (p - 1)(q - 1)
4. Choisir e (exposant public) tel qu'il soit premier avec phi
5. Trouver d (exposant prive) tel que : (d * e) = 1 (mod phi)
la cle publique est donc (e; n) et la cle privee est (d; n) ;
 
 
 

Code :
  1. #include "stdafx.h"
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <time.h>
  5. #include <math.h>
  6. int myRandom();
  7. double isPremier(double);
  8. /**
  9. main()
  10. */
  11. int main(void) {
  12.    int _p, _q, _n, _indEuler;
  13.    int _e = 0;
  14.    int _d = 0;
  15.    int _flag = 0;
  16.  
  17.    do {
  18.                 _p = myRandom();
  19.                 _q = myRandom();
  20.    } while((isPremier(_p) == 0) || (isPremier(_q) == 0) );
  21.  
  22.    _n = _p * _q;
  23.    _indEuler = (_p - 1) * (_q - 1);
  24.  
  25.         while( !_flag ) {
  26.                 if( isPremier(_e) ) {
  27.                         if( (_e % _indEuler == 0) && (_e < _indEuler) ) {
  28.                                 _e++;
  29.                         } else {
  30.                                 // on a trouve l'exposant publique
  31.                                 // on sort du while
  32.                                 _flag = 1;
  33.                         }
  34.                 } else {
  35.                         _e++;
  36.                 }
  37.         }
  38.      
  39.         _flag = 0;
  40.         // on cherche l'exposant prive
  41.         while( !_flag ) {
  42.                 if( ( _e * _d - 1) % _n == 0 ) {
  43.                         // on a trouve
  44.                         _flag = 1;
  45.                 } else
  46.                         _d++;
  47.         }
  48.  
  49.         printf("p = %d\n", _p);
  50.         printf("q = %d\n", _q);
  51.         printf("n = %d\n", _n);
  52.         //printf("Indice Euler = %d\n", _indEuler);
  53.         printf("e = %d\n", _e);
  54.         printf("d = %d\n", _d);
  55.         return (0);
  56. }
  57. /**
  58.         myRandom()
  59. */
  60. int myRandom(void)
  61. {
  62.    static int first = 0;
  63.  
  64.    if (first == 0) {
  65. unsigned int t = (unsigned int) time(NULL);
  66. srand(t);
  67.      
  68.       first = 1;
  69.    }
  70.    return ( rand () % 10 );
  71. }
  72. /**
  73.         isPremier(int)
  74. */
  75. double isPremier(double _entier) {
  76.   static int _premiers[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,
  77.                         43,47,53,59,61,67,71,73,79,83,89,97};
  78.   int i, n;
  79.   double d;
  80.   /* 1 n'est pas premier */
  81.   if (_entier == 1)
  82.   {
  83.     return 0;
  84.   }
  85.   n = sizeof (_premiers) / sizeof (*_premiers);
  86.   /* D'abord on regarde si n est divisible par les nombres premiers dans le tableau */
  87.   for (i = 0; i < n; i++) {
  88.         if (_entier == _premiers[i]) {
  89.       return 1;
  90.     }
  91.         if (((int)_entier) % _premiers[i] == 0) {
  92.       return 0;
  93.         }
  94.   }
  95.   /* Ensuite, on doit regarder a partir du dernier element du tableau+2 jusqu'a sqrt(_entier)... */
  96.   d = sqrt (_entier) + 0.5; /* Le 0.5 permet de tester si c'est un carre parfait... */
  97.   i = _premiers[i-1] + 2;
  98.   while (i < d) {
  99.     if (((int)_entier) % i == 0) {
  100.       return 0;
  101.     }
  102.     i += 2;
  103.   }
  104.   return 1;   
  105. }
  106. /**
  107.  
  108. */
  109. int pgcd(long _a, long _b)
  110. {
  111.     long _dividende = labs(_a); /* le _dividende contient la valeur absolue de a */
  112.     long _diviseur = labs(_b);  /* le _diviseur contient la valeur absolue de b  */
  113.     long _quotient;
  114.     long _reste;
  115.     int _fin = 0;
  116.     /*
  117.      * on ne calcule le pgcd de deux nombres que s'ils sont diffŽrents de zŽro
  118.      */
  119.     if(_a != 0 && _b != 0) {
  120.        while(!_fin) {
  121.            /* On applique la division euclidienne */
  122.            _reste = _dividende % _diviseur;
  123.            _quotient = (_dividende - _reste) / _diviseur;
  124.            /* Si le _reste est diffŽrent de 0, on continue l'algorithme */
  125.            if(_reste != 0) {
  126.                _dividende = _diviseur;
  127.                _diviseur = _reste;
  128.            }
  129.            else {
  130.                _fin = 1;
  131.            }
  132.        }
  133.     }
  134.     else {
  135.        /* Erreur ... */
  136.        _diviseur = 0;
  137.     }
  138.      
  139.     return _diviseur;
  140. }

[#ff0000][/#ff0000][#ff0e00][/#ff0e00]


Message édité par gilou le 14-03-2012 à 16:36:22
Reply

Marsh Posté le 14-03-2012 à 15:34:29   

Reply

Sujets relatifs:

Leave a Replay

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