Hnayn5291 | 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 :
- #include "stdafx.h"
- #include <stdlib.h>
- #include <stdio.h>
- #include <time.h>
- #include <math.h>
- int myRandom();
- double isPremier(double);
- /**
- main()
- */
- int main(void) {
- int _p, _q, _n, _indEuler;
- int _e = 0;
- int _d = 0;
- int _flag = 0;
-
- do {
- _p = myRandom();
- _q = myRandom();
- } while((isPremier(_p) == 0) || (isPremier(_q) == 0) );
-
- _n = _p * _q;
- _indEuler = (_p - 1) * (_q - 1);
-
- while( !_flag ) {
- if( isPremier(_e) ) {
- if( (_e % _indEuler == 0) && (_e < _indEuler) ) {
- _e++;
- } else {
- // on a trouve l'exposant publique
- // on sort du while
- _flag = 1;
- }
- } else {
- _e++;
- }
- }
-
- _flag = 0;
- // on cherche l'exposant prive
- while( !_flag ) {
- if( ( _e * _d - 1) % _n == 0 ) {
- // on a trouve
- _flag = 1;
- } else
- _d++;
- }
-
- printf("p = %d\n", _p);
- printf("q = %d\n", _q);
- printf("n = %d\n", _n);
- //printf("Indice Euler = %d\n", _indEuler);
- printf("e = %d\n", _e);
- printf("d = %d\n", _d);
- return (0);
- }
- /**
- myRandom()
- */
- int myRandom(void)
- {
- static int first = 0;
-
- if (first == 0) {
- unsigned int t = (unsigned int) time(NULL);
- srand(t);
-
- first = 1;
- }
- return ( rand () % 10 );
- }
- /**
- isPremier(int)
- */
- double isPremier(double _entier) {
- static int _premiers[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,
- 43,47,53,59,61,67,71,73,79,83,89,97};
- int i, n;
- double d;
- /* 1 n'est pas premier */
- if (_entier == 1)
- {
- return 0;
- }
- n = sizeof (_premiers) / sizeof (*_premiers);
- /* D'abord on regarde si n est divisible par les nombres premiers dans le tableau */
- for (i = 0; i < n; i++) {
- if (_entier == _premiers[i]) {
- return 1;
- }
- if (((int)_entier) % _premiers[i] == 0) {
- return 0;
- }
- }
- /* Ensuite, on doit regarder a partir du dernier element du tableau+2 jusqu'a sqrt(_entier)... */
- d = sqrt (_entier) + 0.5; /* Le 0.5 permet de tester si c'est un carre parfait... */
- i = _premiers[i-1] + 2;
- while (i < d) {
- if (((int)_entier) % i == 0) {
- return 0;
- }
- i += 2;
- }
- return 1;
- }
- /**
-
- */
- int pgcd(long _a, long _b)
- {
- long _dividende = labs(_a); /* le _dividende contient la valeur absolue de a */
- long _diviseur = labs(_b); /* le _diviseur contient la valeur absolue de b */
- long _quotient;
- long _reste;
- int _fin = 0;
- /*
- * on ne calcule le pgcd de deux nombres que s'ils sont diffŽrents de zŽro
- */
- if(_a != 0 && _b != 0) {
- while(!_fin) {
- /* On applique la division euclidienne */
- _reste = _dividende % _diviseur;
- _quotient = (_dividende - _reste) / _diviseur;
- /* Si le _reste est diffŽrent de 0, on continue l'algorithme */
- if(_reste != 0) {
- _dividende = _diviseur;
- _diviseur = _reste;
- }
- else {
- _fin = 1;
- }
- }
- }
- else {
- /* Erreur ... */
- _diviseur = 0;
- }
-
- return _diviseur;
- }
|
[#ff0000][/#ff0000][#ff0e00][/#ff0e00] Message édité par gilou le 14-03-2012 à 16:36:22
|