windows - Ikke-Linux implementeringer af boost :: random\_device

Indlæg af Hanne Mølgaard Plasc

Problem



For øjeblikket implementerer Boost kun random\_device klassen til Linux (måske * nix) systemer. Er der nogen der kender til eksisterende implementeringer til andre OS'er? Ideelt set ville disse implementeringer være open source.


Hvis der ikke findes nogen, hvordan skal jeg gå i gang med at implementere en ikke-deterministisk RNG til Windows samt Mac OS X? Er der API-opkald i et hvilket som helst miljø, der ville give denne funktionalitet? Tak (og undskyld for alle spørgsmål)!

Bedste reference


På MacOSX kan du bruge/dev/random (siden det er 'a * nix').


På Windows har du sandsynligvis CryptGenRandom-funktionen. Jeg ved ikke, om der er en implementering af boost :: random\_device, der bruger den.

Andre referencer 1


Afhænger af, hvad du vil bruge dig RNG til.


Generelt vil du foder frø data i en buffer, generere hash værdier af bufferen, bland en tæller i resultatet og hash det lidt mere. Grunden til at bruge hash funktion er, at gode hash er designet til at give tilfældige- ser resultater fra input data, der er mere struktureret.


Hvis du vil bruge det til kryptografi, bliver det meget hårdere. Du skal springe igennem flere hoops for at sikre, at din RNG holder gentagne mønstre inden for rimeligt sikre grænser. Jeg kan anbefale Bruce Schneiers 'Praktiske kryptografi' (for en introduktion til RNG'er og en prøveimplementering). Han har også nogle RNG-relaterede ting op om hans yarrow RNG. [4]

Andre referencer 2


Hvis boost afhænger af/dev/random, er chancerne det virker på MacOS også (som det har det).


På Windows er der CryptoAPI som en del af operativsystemet, og det giver en kryptokvalitet RNG.


Jeg tror også, at moderne Intel-CPU'er har en hardware-RNG på chippen - men du skal finde ud af, hvordan man får det ved hvert OS. Brug af API'er på højere niveau er nok en bedre indsats.


rediger: Her er et link til hvordan Intel RNG fungerer [5]

Andre referencer 3


OpenSSL har en anstændig en.


#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 har en på Win32. Det kræver nogle få mere funktionsopkald. Ikke inkluderet detaljerne her, fordi der er 2 til 5 args for hver af disse opkald. Vær forsigtig, at CryptoAPI synes at kræve, at brugeren har en komplet lokal profil (C: \ Documents and Settings \ user \ Local Settings) korrekt konfigureret, før det kan give dig et tilfældigt tal.


CryptAcquireContext // see docs
CryptGenRandom
CryptReleaseContext