2011-10-26 12 views
8

Me preguntaba si hay una forma de hacer uso del nuevo generador de números basado en hardware que se encuentra en la CPU del puente arenoso de Intel. Leí que Intel's MKL (Math Kernel Library) expone esta funcionalidad, pero esto requiere el conjunto de MKL y un complemento de inteligencia, que termina siendo bastante caro.Haciendo uso del hardware de bridge verdadero generador de números al azar?

¿Hay alguna otra forma de emplear el generador de números aleatorios de hardware en mi código C++? Por ejemplo, una buena biblioteca de solo encabezado?

+2

¿Qué plataforma de sistema operativo? No me sorprendería si se hace automáticamente tanto en Linux como en Windows, en función de las capacidades de hardware. – unwind

+0

Estoy desarrollando bajo Windows 7, pero mi proyecto usa Qt y eventualmente apuntaré a Windows y Linux, y si la compatibilidad de cacao de Qt se repara pronto, espero que macOS también – dtech

+3

Simplemente escriba un poco de ensamblado en línea para ejecutar la instrucción RDRAND. O espera a que tu compilador sea compatible con lo intrínseco. O mejor aún, espere un par de años, por lo que tendrá algunas probabilidades de que su usuario tenga una máquina que lo soporte. Manual está aquí: http://software.intel.com/file/36945 –

Respuesta

0

Podría depender de su sistema operativo. Me imagino que los núcleos recientes de GNU/Linux podrían usar los generadores aleatorios de hardware para, p. Ej. /dev/random (ya que la página del manual random(4) sugiere que usa ruido), pero podría estar equivocado.

La práctica habitual es utilizar algún generador común pseudo-aleatorio (como por ejemplo, el random(3) función estándar), pero a la semilla que, cuando se inicia la aplicación, de alguna fuente más al azar (por ejemplo, la lectura de /dev/urandom, utilizando getpid() y algo de la hora actual con gettimeofday(), etc.).

Muy probablemente, conseguir números aleatorios muy buenos es un arte negro, al menos para mí. Pero la solución anterior tiene al menos la ventaja de no ser fácilmente reproducible de una aplicación a otra.

Si su aplicación es de larga duración (por ejemplo, un servicio web que se ejecuta en el mismo proceso durante muchas horas), quizás pueda volver a inicializar su Pseudo generador de números aleatorios de vez en cuando. Para un servidor web, me imagino que también podría usar los tiempos de solicitud (midiéndolos con granularidad de milisegundos) como fuente de aleatoriedad (para inicializar su PRNG).

+2

Hay un hilo sobre RDRAND y '/ dev/random' aquí: http://www.spinics.net/lists/linux-crypto/msg05883. html, aunque no sé si lo que dicen es exactamente lo que sucedió o lo que sucederá. Lo esencial es que tienes razón, parece que se usará como fuente de entropía para '/ dev/random', aunque no es tan simple como'/dev/random' simplemente devolviendo los resultados de las llamadas a RDRAND. –

8

Intel ha publicado un manual, una biblioteca y ejemplos de código para la instrucción rdrand en http://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide.

Desde el Léame:.

"Debido a que la muchos de cadenas de herramientas de compilación no apoyan esta nueva instrucción, esta biblioteca fue creado para facilitar el acceso a ella la idea es simple: enlace a un dispositivo integrado estática biblioteca y disfruta de la nueva función! "

Hay ejemplos de todas las llamadas a la biblioteca en main.c.

Pude compilar la biblioteca estática y el programa de prueba en gcc en Mac OS X. La documentación indica que también es compatible con Linux y Windows.

Tenga en cuenta que rdrand es en realidad un generador de números pseudoaleatorio de 128 bits con entropía generada por hardware. (La próxima arquitectura de Broadwell proporcionará una instrucción rdseed para acceder al verdadero generador de números aleatorios). Los detalles de la diferencia y sus implicaciones se pueden encontrar en el encabezado "Respuesta larga" al http://software.intel.com/en-us/blogs/2012/11/17/the-difference-between-rdrand-and-rdseed.

1

Aquí es el código de ejemplo:

#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 

Referencia: Intel Intrinsics Guide

Cuestiones relacionadas