Maison > développement back-end > C++ > Comment puis-je générer des graines entièrement aléatoires pour mt19937 en C ?

Comment puis-je générer des graines entièrement aléatoires pour mt19937 en C ?

Mary-Kate Olsen
Libérer: 2024-12-04 06:59:13
original
547 Les gens l'ont consulté

How Can I Generate Thoroughly Random Seeds for mt19937 in C  ?

Génération complète de graines aléatoires pour mt19937 en C

Problème :

Les réponses récentes suggèrent souvent d'utiliser avec std::random_device pour amorcer le PRNG mt19937, qui est défectueux car il ne fournit pas suffisamment de caractère aléatoire, peut être prévisible et peut utiliser un PRNG avec une graine fixe.

Ensemencement portable et approfondi :

Une approche portable et approfondie de l'ensemencement de mt19937 implique l'utilisation d'un CSPRNG, tel comme :

  • Windows : sysrandom utilisant CryptGenRandom
  • Unix-Like : sysrandom utilisant /dev/urandom (ou getrandom si disponible sur Linux 3.17 ou supérieur)
  • OpenBSD : sysrandom utilisant getentropy

Exemple de code :

#include <cstdint>
#include <cstdlib>
#include <fstream>

size_t sysrandom(void* dst, size_t dstlen);

std::uint_least32_t seed;
sysrandom(&seed, sizeof(seed));
std::mt19937 gen(seed);
Copier après la connexion

Linux Spécialisation avec getrandom :

#if defined(HAVE_GETRANDOM)
size_t sysrandom(void* dst, size_t dstlen) {
  int bytes = syscall(SYS_getrandom, dst, dstlen, 0);
  if (bytes != dstlen) {
    throw std::runtime_error("Unable to read N bytes from CSPRNG.");
  }
  return dstlen;
}
#endif
Copier après la connexion

Cas spécial OpenBSD :

#if defined(HAVE_GETENTROPY)
size_t sysrandom(void* dst, size_t dstlen) {
  int bytes = getentropy(dst, dstlen);
  if (bytes != dstlen) {
    throw std::runtime_error("Unable to read N bytes from CSPRNG.");
  }
  return dstlen;
}
#endif
Copier après la connexion

Autres réflexions :

  • Utilisez une approche de lecture/écriture sans tampon pour des informations aléatoires cryptographiquement sécurisées. octets.
  • Des fonctions spécialisées (par exemple, pour Linux ou OpenBSD) peuvent être ajoutées pour une efficacité améliorée.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal