Question

Actuellement, Boost implémente uniquement la classe random_device pour les systèmes Linux (peut-être * nix). Est-ce que quelqu'un connaît des implémentations existantes pour d'autres systèmes d'exploitation? Idéalement, ces implémentations seraient à source ouverte.

S'il n'en existe pas, comment puis-je mettre en œuvre un RNG non déterministe pour Windows ainsi que pour Mac OS X? Existe-t-il des appels d'API dans l'un ou l'autre environnement offrant cette fonctionnalité? Merci (et désolé pour toutes les questions)!

Était-ce utile?

La solution

Sous MacOSX, vous pouvez utiliser / dev / random (puisqu'il s'agit d'un * nix).

Sous Windows, vous voulez probablement la fonction CryptGenRandom. Je ne sais pas s'il existe une implémentation de boost :: random_device qui l'utilise.

Autres conseils

Cela dépend de ce pour quoi vous voulez utiliser votre RNG.

En termes généraux, vous allez introduire les données de départ dans un tampon, générer des valeurs de hachage du tampon, mélanger un compteur dans le résultat et le hacher encore. La raison d'utiliser une fonction de hachage est que les bonnes hachages sont conçus pour produire des résultats aléatoires à partir de données d'entrée plus structurées.

Si vous voulez l'utiliser pour la cryptographie, les choses vont devenir beaucoup plus difficiles. Vous devrez franchir plus d'obstacles pour vous assurer que votre GNA continue de répéter des modèles dans des limites raisonnablement sûres. Je peux recommander la "cryptographie pratique" de Bruce Schneier. (pour une introduction sur les RNG, et un exemple de mise en œuvre). Il a également des infos sur le yarrow RNG.

Si boost s'appuie sur / dev / random, cela fonctionne probablement aussi sur MacOS (comme il l'a fait).

Sous Windows, CryptoAPI fait partie du système d’exploitation et fournit un RNG de qualité crypto.

De plus, je pense que les processeurs Intel modernes ont un générateur de ressources réseau (RNG) sur la puce. Cependant, il vous faudra trouver le moyen de l'obtenir sur chaque système d'exploitation. L'utilisation des API de niveau supérieur constitue probablement un meilleur choix.

modifier: voici un lien sur le fonctionnement du groupe Intel RNG.

OpenSSL en a un bon.

#include <openssl/rand.h>
...
time_t now = time(NULL);
RAND_seed(&now, sizeof(now)); // before first number you need

int success = RAND_bytes(...);
if (!success) die_loudly();

RAND_cleanup(); // after you don't need any more numbers

Microsoft CryptoAPI en a un sur Win32. Cela nécessite quelques appels de fonction supplémentaires. Non compris les détails ici car il y a 2 à 5 arguments pour chacun de ces appels. Attention, CryptoAPI semble nécessiter que l'utilisateur dispose d'un profil local complet (C: \ Documents and Settings \ utilisateur \ Paramètres locaux) correctement configuré avant de pouvoir vous attribuer un numéro aléatoire.

CryptAcquireContext // see docs
CryptGenRandom
CryptReleaseContext
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top