Résoudre les problèmes d'amorçage PRNG en C
Malgré l'utilisation généralisée de
Évitez de vous fier uniquement à std::random_device et time(NULL)
L'utilisation de std::random_device ou time(NULL) seul est insuffisante pour l'amorçage mt19937 en raison d'une faible entropie et d'une distribution non uniforme.
Solution : utiliser un wrapper CSPRNG
Une solution minimale consiste à utiliser un wrapper autour d'un CSPRNG, tel que sysrandom défini ci-dessous. Ce wrapper donne accès à des octets aléatoires de qualité cryptographique :
size_t sysrandom(void* dst, size_t dstlen);
Implémentations spécifiques à la plate-forme
Pour Windows, nous pouvons utiliser CryptGenRandom :
size_t sysrandom(void* dst, size_t dstlen) { HCRYPTPROV ctx; ... // Acquire and release cryptographic context CryptGenRandom(ctx, dstlen, dst); return dstlen; }
Sur les systèmes de type Unix, nous pouvons employer /dev/urandom :
size_t sysrandom(void* dst, size_t dstlen) { std::ifstream stream("/dev/urandom", std::ios_base::binary | std::ios_base::in); stream.read(dst, dstlen); return dstlen; }
Amorçage de mt19937
En utilisant le wrapper sysrandom, nous pouvons amorcer mt19937 avec suffisamment de bits :
std::uint_least32_t seed; sysrandom(&seed, sizeof(seed)); std::mt19937 gen(seed);
Comparaison avec Boost
Cette approche est parallèle à boost::random_device, qui utilise des CSPRNG sécurisés sur diverses plates-formes.
Considérations supplémentaires
Sous Linux, getrandom fournit une alternative plus sécurisée à /dev/urandom. OpenBSD n'a pas /dev/urandom ; utilisez plutôt getentropy.
Conclusion
Cet article fournit un guide complet pour amorcer efficacement le PRNG mt19937, garantissant une génération de nombres aléatoires de haute qualité en C
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!