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.