Domanda

Attualmente, Boost implementa solo la classe random_device per sistemi Linux (forse * nix). Qualcuno conosce implementazioni esistenti per altri sistemi operativi? Idealmente, queste implementazioni sarebbero open-source.

Se non esiste nessuno, come devo fare per implementare un RNG non deterministico per Windows e Mac OS X? Esistono chiamate API in entrambi gli ambienti che fornirebbero questa funzionalità? Grazie (e scusate per tutte le domande)!

È stato utile?

Soluzione

Su MacOSX, puoi usare / dev / random (dato che è un * nix).

Su Windows, probabilmente vuoi la funzione CryptGenRandom. Non so se esiste un'implementazione di boost :: random_device che lo utilizza.

Altri suggerimenti

Dipende da cosa vuoi usare per il tuo RNG.

In termini generali, inserirai i dati di seed in un buffer, genererai valori di hash del buffer, mescolerai un contatore nel risultato e lo hash un po 'di più. Il motivo dell'utilizzo di una funzione hash è che buoni hash sono progettati per produrre risultati dall'aspetto casuale da dati di input più strutturati.

Se vuoi usarlo per la crittografia, le cose diventeranno molto più pelose. Dovrai saltare più cerchi per assicurarti che il tuo RNG continui a ripetere schemi entro limiti ragionevolmente sicuri. Posso consigliare la "crittografia pratica" di Bruce Schneier " (per un'introduzione sugli RNG e un'implementazione di esempio). Ha anche raccolto alcune cose relative al RNG sul suo achillea RNG.

Se boost si basa su / dev / random, è probabile che funzioni anche su MacOS (dato che lo ha).

Su Windows c'è CryptoAPI come parte del sistema operativo e che fornisce un RNG di qualità crittografica.

Inoltre, credo che le moderne CPU Intel abbiano un RNG hardware sul chip, tuttavia dovresti capire come ottenerlo su ciascun sistema operativo. L'uso delle API di livello superiore è probabilmente una scommessa migliore.

modifica: ecco un link a come funziona Intel RNG

OpenSSL ne ha uno decente.

#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 ne ha uno su Win32. Richiede qualche altra chiamata di funzione. Non includendo i dettagli qui perché ci sono da 2 a 5 argomenti per ciascuna di queste chiamate. Fai attenzione, CryptoAPI sembra richiedere all'utente un profilo locale completo (C: \ Documents and Settings \ user \ Local Settings) impostato correttamente prima che possa darti un numero casuale.

CryptAcquireContext // see docs
CryptGenRandom
CryptReleaseContext
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top