Utilisation de moteurs pour la génération de nombres aléatoires

J’essaie d’utiliser l’API RAND_bytes d’OpenSSL, mais je souhaite l’essayer avec différents moteurs de génération de nombres aléatoires.

Existe-t-il une méthode recommandée pour générer des octets aléatoires et append de l’entropie dans OpenSSL? Où puis-je me procurer d’autres implémentations de moteur et comment puis-je les échanger?

Existe-t-il une méthode recommandée pour générer des octets aléatoires et append de l’entropie dans OpenSSL?

Oui. Voir le wiki OpenSSL sur les nombres aléatoires . Il vous aide à append de l’entropie pour une graine et à extraire des octets pour les utiliser dans la saisie et d’autres informations secrètes.

L’ajout d’entropie pour l’ensemencement est traité dans Numéros et semences aléatoires . L’extraction d’octets destinés à être utilisés dans la saisie de clés et d’autres documents secrets est traitée dans Random Numbers and Generation .


Où puis-je me procurer d’autres implémentations de moteur et comment puis-je les échanger?

OpenSSL est livré avec quelques moteurs liés aux nombres aléatoires. La valeur par défaut est un moteur PRNG basé sur un logiciel, md_rand . Vous pouvez trouver son code source à /crypto/rand/md_rand.c . Un autre est le moteur RDRAND d’Intel. Vous pouvez trouver la source sur /crypto/engine/eng_rdrand.c .

Vous pouvez également utiliser des RNG basés sur du matériel si vous en avez le matériel. Vous pouvez même écrire votre propre moteur fournissant un SHA-512 HMAC. Ou même celui qui combine (XOR) un SHA-512 HMAC avec RDRAND . Le Twister Mersenne est populaire, et vous pouvez même écrire un moteur pour cela aussi.

Voici comment vous permutez un moteur à utiliser pour des nombres aléatoires. Elle provient du wiki OpenSSL et RDRAND moteur Intel RDRAND :

  1 unsigned long err = 0; 2 int rc = 0; 3 4 OPENSSL_cpuid_setup(); 5 ENGINE_load_rdrand(); 6 7 ENGINE* eng = ENGINE_by_id("rdrand"); 8 err = ERR_get_error(); 9 10 if(NULL == eng) { 11 fprintf(stderr, "ENGINE_load_rdrand failed, err = 0x%lx\n", err); 12 abort(); /* failed */ 13 } 14 15 rc = ENGINE_init(eng); 16 err = ERR_get_error(); 17 18 if(0 == rc) { 19 fprintf(stderr, "ENGINE_init failed, err = 0x%lx\n", err); 20 abort(); /* failed */ 21 } 22 23 rc = ENGINE_set_default(eng, ENGINE_METHOD_RAND); 24 err = ERR_get_error(); 25 26 if(0 == rc) { 27 fprintf(stderr, "ENGINE_set_default failed, err = 0x%lx\n", err); 28 abort(); /* failed */ 29 } 30 31 /* OK to proceed */ 32 33 ... 34 ENGINE_finish(eng); 35 ENGINE_free(eng); 36 ENGINE_cleanup(); 

… J’essaie d’utiliser l’API RAND_bytes d’OpenSSL …

Vous ne faites jamais autre chose que d’utiliser RAND_bytes , RAND_add et des amis comme d’habitude. Comment vous utilisez RAND_bytes , RAND_add et vos amis ne changent jamais.


Le Twister Mersenne est populaire, et vous pourriez même écrire un moteur pour cela aussi …

Si vous faites cela, vous pourriez alors envisager de publier le code source pour que d’autres le utilisent. Je suggérerais de créer une page sur le wiki d’OpenSSL, d’expliquer le moteur Mersenne Twister, d’expliquer comment l’utiliser et de fournir un correctif.

L’autre option consiste à le soumettre au système RT (le suivi des bogues) en tant que fonctionnalité / amélioration. Mais cela a été mon observation que la plupart des choses se flésortingssent et meurent une fois qu’elles entrent dans la RT.