IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

génération de clé RSA


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 40
    Par défaut génération de clé RSA
    Bonjour j'ai fait ce petit programme pour générer les clé de RSA mais elles ne sont pas bonne a part le p et le q et l'indice d'euler les autres ne sont pas bonne et je ne comprend pa comment faire pour que celle ci soit bonne si quelqu'un peut m'aider

    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 '(n) = (p - 1)(q - 1)
    4. Choisir e (exposant public) tel qu'il soit premier avec '(n)
    5. Trouver d (exposant prive) tel que : (d * e) = 1 (mod '(n))
    la cle publique est donc (e; n) et la cle privee est (d; n) ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
     
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include <math.h>
     
    int myRandom();
    int isPremier(int);
     
    /**
     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( (_n % _e == 0) && (_e < _n) ) {
    				_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) {
          srand (time (NULL));
          first = 1;
       }
       return ( rand () % 10 );
    }
     
    /**
            isPremier(int)
    */
    int isPremier(int _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 (_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 (_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;
    }

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    4. Choisir e (exposant public) tel qu'il soit premier avec '(n)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      _indEuler = (_p - 1) * (_q - 1);
       	while( !_flag ) {
    		if( isPremier(_e) ) {
    			if( (_n % _e == 0) && (_e < _n) ) {
    				_e++;
    			} else {
    				// on a trouve l'exposant publique
    				// on sort du while
    				_flag = 1;
    			}
    		} else {
    			_e++;
    		}
    	}
    Ce code ne correspond pas à la proposition 4, il est indépendant de '(n)

  3. #3
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 40
    Par défaut
    je comprend le probleme vient de la car e n'est pas premier avec '(n) mais je n'arrive pas a implémenter la partie avec calcul de pgcd et algorithme d'euclide qui me permettrais de trouver e. je planche sur papier la et franchement je suis larguer je vient ici en dernier secours donc si quelqu'un peut m'aider sur cette partie merci.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Apparemment (mis a part _quotient qui ne sert à rien) la fonction pgcd fonctionne correctement. Il reste à choisir e tel que le pgcd de e et _indEuler soit 1

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Quel est ton problème ? J'ai lancé ton programme et tes valeurs sont correctes.
    Pour p=5 et q=2, j'ai eu e=3 et d=7.
    Bon, ok tu choisis e carrèment premier et qui ne divise pas '(n). C'est sûr comme ça, il sera premier avec '(n), heureusement que tu travailles avec tes petites valeurs.
    Et 3*7 mod 4 vaut bien 1.

    Non, le problème de ton algo est que ça manque d'aléatoire.
    Déjà, le succés du RSA repose sur le fait que p et q doivent être très grands car la factorisation d'un grand nombre est très couteuse. Bon passons, c'est pour l'exemple.

    Par contre, ton e restera toujours proche de 2 et en plus il est toujours premier alors qu'il suffirait qu'il soit premier avec '(n). Tu peux prendre au hasard un nombre inférieur à '(n) et calculer le pgcd de ce nombre avec '(n) jusqu'à trouver un nombre pour lequel le PGCD vaut 1. Tu pourrais ainsi utiliser ta fonction pgcd (qui au passage me paraît bien compliqué).
    Et pour d, tu peux utiliser Bezout pour résoudre d * e + _ * '(n) = 1, qui a une solution car e et '(n) ont été choisis premiers entre eux.

  6. #6
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 40
    Par défaut
    sa ne marche pas bien vu que si on prend l'exemple p=3 et q=7 on devrait trouver e et d =5 mais on a pas les bon chiffres donc il y a bien un probleme dans le code au moment de calculer e.

    En utilisant la methode de prendre un chiffre plus petit que '(n) en cherchant a trouver celui qui me donnerai un pgcd egal a 1 cela pourait fonctioner je vais essayer d'implementer sa.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Citation Envoyé par king_neo2001 Voir le message
    sa ne marche pas bien vu que si on prend l'exemple p=3 et q=7 on devrait trouver e et d =5 mais on a pas les bon chiffres donc il y a bien un probleme dans le code au moment de calculer e.
    Oui effectivement, on obtient 2 ce qui n'est pas bon. C'est ton test qui n'est pas bon. Je te propose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( (_indEuler % _e == 0) && (_e < _indEuler) ) {
    Mais vois avec ce que je te dis avant, au moins e et '(n) seront premiers entre eux et il y aura un peu plus de hasard.

  8. #8
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 40
    Par défaut
    Citation Envoyé par aoyou Voir le message
    Oui effectivement, on obtient 2 ce qui n'est pas bon. C'est ton test qui n'est pas bon. Je te propose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( (_indEuler % _e == 0) && (_e < _indEuler) ) {
    Mais vois avec ce que je te dis avant, au moins e et '(n) seront premiers entre eux et il y aura un peu plus de hasard.

    Avec ta condition quand je lance le programme il est vraiment long mais au moins e est exact par contre la le probleme viendrait plutot de d qui alors maintenan est soit négatif soit faux je ne comprends vraiment plus rien....

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Ce n'était qu'une proposition. De toutes façons, cette méthode n'est pas terrible.
    Pour d tu dois résoudre une équation diophantienne avec l'algorithme d'Euclide étendu comme tu le disais toi-même, et non tester tes valeurs une à une, ce sera plus efficace.

  10. #10
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 40
    Par défaut
    oui justement le truc c'est que je suis venu ici car j'arrive pas a résoudre cette équation pour le d en math je suis vraiment nul et la je suis larguer j'ai essayer sur papier mais sa fonctionne pas.

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Si tu galères tant que ça, tu peux lire cet article de Wikipédia.
    C'est juste un PGCD inversé.
    http://fr.wikipedia.org/wiki/Algorit...de_%C3%A9tendu

Discussions similaires

  1. Méthode de génération de clé RSA selon un taille désirée
    Par darkwall_37 dans le forum Mathématiques
    Réponses: 5
    Dernier message: 23/08/2012, 15h00
  2. Génération de cléfs RSA 1024
    Par capelec dans le forum C
    Réponses: 3
    Dernier message: 29/08/2011, 11h28
  3. [Lomboz] Génération de code pour EJB
    Par paikan dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 09/07/2003, 14h28
  4. cherche algos encryption en RSA et ELGAMAL
    Par Vermin dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 04/11/2002, 08h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo