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
Libérer: 2024-11-29 01:11:11
original
807 Les gens l'ont consulté

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);
Copier après la connexion

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;
}
Copier après la connexion

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal