Maison >développement back-end >C++ >Comment puis-je amorcer correctement le PRNG MT19937 en C pour une génération sécurisée de nombres aléatoires ?

Comment puis-je amorcer correctement le PRNG MT19937 en C pour une génération sécurisée de nombres aléatoires ?

DDD
DDDoriginal
2024-11-29 01:11:11703parcourir

How Can I Properly Seed the MT19937 PRNG in C   for Secure Random Number Generation?

Comment amorcer soigneusement le PRNG MT19937 en C

Généralement, std::random_device est utilisé pour générer des nombres aléatoires, comme le montre le code suivant :

std::random_device rd;  
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 5);
dis(gen);

Cependant, cette méthode est imparfaite parce que :

  • std::random_device() renvoie une entropie insuffisante.
  • std::mt19937 gen(rd());gen() peut ne pas produire une bonne distribution de sortie.
  • std::random_device peut être implémenté en tant que PRNG avec un seed.

Une approche plus fiable consiste à utiliser un CSPRNG, tel que CryptGenRandom sur Windows ou /dev/urandom sur les systèmes de type Unix, pour générer des octets aléatoires de haute qualité pour amorcer le PRNG. Par exemple :

#include <bit>
#include <iostream>
#include <string>

size_t sysrandom(void* dst, size_t dstlen) {
    std::ifstream stream("/dev/urandom", std::ios_base::binary | std::ios_base::in);
    stream.read((char*)dst, dstlen);
    return dstlen;
}

int main() {
    std::uint_least32_t seed;
    sysrandom(&seed, sizeof(seed));
    std::mt19937 gen(seed);

    // Your code to use the generator here...
    return 0;
}

Ce code utilise /dev/urandom comme CSPRNG et amorce le PRNG en utilisant une valeur de 32 bits, qui devrait être augmentée pour une meilleure sécurité. Cette approche est portable, bien testée et facile à utiliser, fournissant une base solide pour générer des nombres aléatoires 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn