2011-10-26 9 views
8

Mi chiedevo se c'è un modo per utilizzare il nuovo generatore di numeri vero basato su hardware trovato nella CPU del bridge sabbioso di Intel. Ho letto che intel MKL (Math Kernel Library) espone questa funzionalità, ma questo richiede la suite MKL e un compilatore Intel, finendo piuttosto costoso.Fare uso del generatore di numeri casuali vero hardware di Sandy Bridge?

Esiste un altro modo per utilizzare il generatore di numeri casuali dell'hardware nel mio codice C++? Ad esempio una bella libreria di sola intestazione?

+2

Quale piattaforma del sistema operativo? Non sarei sorpreso se fosse fatto automaticamente in Linux e Windows, in base alle capacità hardware. – unwind

+0

Sto sviluppando sotto Windows 7, ma il mio progetto usa Qt e finirà per indirizzare sia windows che linux, e se la compatibilità con il cacao Qt verrà risolta presto, si spera anche macOS – dtech

+3

Basta scrivere un po 'di assembly inline per eseguire l'istruzione RDRAND. Oppure attendi che il tuo compilatore supporti l'intrinseco. O meglio ancora, aspetta un paio di anni così avrai qualche probabilità che il tuo utente abbia una macchina che lo supporta. Il manuale è disponibile qui: http://software.intel.com/file/36945 –

risposta

0

Potrebbe dipendere dal sistema operativo. Immagino che i kernel GNU/Linux recenti possano usare i generatori casuali dell'hardware per es. /dev/random (poiché la pagina man dello random(4) suggerisce di utilizzare il rumore), ma potrei sbagliarmi.

La pratica abituale è di utilizzare alcuni comune generatore pseudo-casuale (come ad esempio la funzione standard random(3)), ma a seme che, quando si inizia l'applicazione, da qualche fonte più casuale (esempio lettura /dev/urandom, utilizzando getpid() e qualcosa l'ora corrente con gettimeofday(), ecc.).

Molto probabilmente, ottenere numeri casuali molto buoni è un'arte nera, almeno per me. Ma la soluzione di cui sopra ha almeno il vantaggio di non essere facilmente riproducibile da una sessione di un'applicazione a un'altra.

Se la tua applicazione è di lunga durata (ad esempio un servizio Web in esecuzione nello stesso processo per molte ore) potresti ri-seminare il tuo Generatore di Numeri Pseudo Casuali di volta in volta. Per un server web, immagino che potresti anche usare i tempi di richiesta (misurandoli con millisecondo granularità) come fonte di casualità (per seminare il tuo PRNG).

+2

C'è una discussione su RDRAND e '/ dev/random' qui: http://www.spinics.net/lists/linux-crypto/msg05883. html, anche se non so se quello che dicono è esattamente quello che è successo o succederà. L'essenza è che hai ragione, sembra che sarà usato come fonte di entropia per '/ dev/random', anche se non è così semplice come'/dev/random' restituendo solo i risultati delle chiamate a RDRAND. –

8

Intel ha pubblicato un manuale, una libreria e esempi di codice per l'istruzione rdrand allo http://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide.

Dal Leggimi:.

"Poiché la molte delle toolchain del compilatore non supportano questa nuova istruzione, la biblioteca era creato per facilitare l'accesso ad essa L'idea è semplice: link a un built statica biblioteca e goditi la nuova funzionalità! "

Ci sono esempi di tutte le chiamate di libreria in main.c.

Sono stato in grado di compilare la libreria statica e il programma di test in gcc su Mac OS X. La documentazione afferma che è anche compatibile con Linux e Windows.

Si noti che rdrand è in realtà un generatore di numeri pseudocasuali a 128 bit con entropia generata da hardware. (La prossima architettura Broadwell fornirà un'istruzione rdseed per accedere al vero generatore di numeri casuali.) I dettagli della differenza e le sue implicazioni possono essere trovati sotto la voce "Risposta lunga" allo http://software.intel.com/en-us/blogs/2012/11/17/the-difference-between-rdrand-and-rdseed.

1

Ecco il codice di esempio:

#include <immintrin.h> 
#include <cstdint> 
... 
uint64_t val; 
if(!_rdseed64_step(&val)) { 
    printf("Error generating hardware random value\n"); 
} 
// Now val contains 64-bit pseudo-random number 

uint64_t val; 
if(!_rdrand64_step(&val)) { 
    printf("Error generating hardware random value\n"); 
} 
// Now val contains 64-bit true random number 

Riferimento: Intel Intrinsics Guide