2017-09-23 11 views
2

J'ai besoin de calculer une clé privée (privateKey) pour l'échange de clé Diffie-Hellman. J'ai donné un grand premier prime et maintenant je dois juste choisir un nombre qui est inférieur à p. Ceci est mon code:Génération de nombres aléatoires GMP C++ pour Diffie-Hellman Key Exchange

 mpz_class privateKey; 
     unsigned long seed; 
     mpz_init(privateKey.get_mpz_t()); 

     gmp_randstate_t rstate; 
     gmp_randinit_mt(rstate); 
     gmp_randseed_ui(rstate, seed); 

     mpz_urandomm(privateKey.get_mpz_t(), rstate, prime.get_mpz_t()); 

Je ne comprends pas vraiment pourquoi je reçois toujours le même nombre "aléatoire".

Répondre

2

Vous n'initialisez jamais la variable seed, donc votre programme est évidemment erroné et votre compilateur aurait dû vous en avertir. Si ce n'est pas le cas, cherchez comment configurer votre compilateur correctement (par exemple, pour GCC, assurez-vous de passer au moins -O -Wall).

Vous obtiendrez toujours le même nombre aléatoire si vous initialisez le GNA avec la même graine. C'est probablement ce qui se passe dans votre programme: seed n'est pas initialisé, donc sa valeur est tout ce qui était sur la pile à cette adresse précédemment, et cela s'avère toujours le même si vous appelez cette fonction de la même manière.

Puisqu'il s'agit d'une application cryptographique, vous devez ensemencer le générateur de nombres aléatoires avec une source à forte entropie. Demandez à votre système d'exploitation (il n'y a aucun moyen de générer de l'entropie dans un programme): lisez /dev/urandom sous Linux, appelez le CryptGenRandom sous Windows.

De plus, puisqu'il s'agit d'une application cryptographique, n'appelez pas gmp_randinit_mt. Cela crée un twister Mersenne, qui est rapide et assez bon pour une simulation physique, mais ne convient pas à la cryptographie car son état peut être reconstruit à partir de ses sorties. Je ne suis pas familier avec GMP, mais en regardant le documentation, je vois qu'il offre plusieurs algorithmes pour la génération de nombres aléatoires, mais aucun ne convient aux applications de sécurité. Vous pouvez utiliser la source du système d'exploitation comme /dev/urandom ou CryptGenRandom directement comme une source de bits aléatoires, mais alors vous devrez utiliser cela pour implémenter l'interface gmp_randstate_t afin de le connecter avec mpz_urandomm. Je ne sais pas à quel point c'est difficile.

S'il s'agit d'un exercice scolaire, faites ce que votre professeur vous dira. Si c'est pour une application réelle, utilisez une bibliothèque de cryptographie existante telle que libtom, qui contient tout ce dont vous avez besoin pour générer des nombres aléatoires de qualité cryptographique et pour effectuer les calculs Diffie-Hellman, est très facile à intégrer dans un projet et a une licence qui lui permet d'être intégrée dans n'importe quel projet.