c++ assembly c++11 random rdrand

Números aleatorios verdaderos con C++ 11 y RDRAND



assembly c++11 (5)

  1. Creo que "se dice que son" al azar ... ya que es para el cifrado. No me preocuparía demasiado por la calidad de los números aleatorios.
  2. Creo que Intel seguirá haciéndolo, ya que siempre consideran que la compatibilidad con versiones anteriores es importante, incluso si esta instrucción puede ser inútil en el futuro.
  3. Lamento no poder responder esta pregunta porque no uso C ++ 11.
  4. Puedes probar librdrand.a si no quieres profundizar en el código ensamblador. Intel ha proporcionado la biblioteca para su descarga gratuita en su sitio web. Lo he probado, es bastante conveniente y tiene un mecanismo de informe de errores (dado que el generador de números aleatorios tiene una pequeña probabilidad de no generar un número aleatorio). Entonces, si usa esta biblioteca, solo necesita verificar el valor de retorno de la función en librdrand

Por favor, avíseme si hay algo mal en mi respuesta. Gracias

Buena suerte

xiangpisaiMM

He visto que Intel parece haber incluido una nueva función de ensamblaje para obtener números aleatorios reales obtenidos del hardware. El nombre de la instrucción es RdRand , pero solo una pequeña cantidad de detalles parece accesible en Internet: http://en.wikipedia.org/wiki/RdRand

Mis preguntas sobre esta nueva instrucción y su uso en C ++ 11 son las siguientes:

  1. ¿Los números aleatorios generados con RdRand realmente aleatorios? (cada bit generado a partir de ruido blanco no correlacionado o procesos cuánticos?)

  2. ¿Es una característica especial de los procesadores Ivy Bridge e Intel continuará implementando esta función en la próxima generación de CPU?

  3. ¿Cómo usarlo a través de C ++ 11? Tal vez con std::random_device pero ¿los compiladores ya llaman a RdRand si la instrucción está disponible?

  4. ¿Cómo comprobar si RdRand realmente se llama cuando compilo un programa?


  1. Eso ciertamente depende de su visión del determinismo del universo, por lo que es más una cuestión filosófica, pero muchas personas lo consideran aleatorio.
  2. Solo Intel lo sabrá, pero dado que hubo una demanda para agregarlo, es probable que haya demanda para mantenerlo
  3. std::random_device no es necesario que sea controlado por hardware, e incluso si lo es, no es necesario utilizar rdrand . Puede preguntar a su función de miembro de double entropy() const noexcept ya sea impulsada por hardware o no. Usar rdrand para eso es un problema de QoI, pero esperaría que todas las implementaciones sanas que lo tienen disponible lo hagan (he visto, por ejemplo, gcc hacerlo). Si no está seguro, siempre puede verificar el ensamblaje, pero también otros medios de aleatoriedad de hardware deberían ser lo suficientemente buenos (hay otro hardware dedicado disponible).
  4. Vea arriba, si le interesa saber si es el único hardware, use entropy , si está interesado en rdrand, escanee el código de máquina generado.

1) No, los números de RdRand no son realmente aleatorios, ya que provienen de un generador de números pseudoaleatorios criptográficamente seguro. Sin embargo, RdRand, RdSeed y la tecnología Intel Secure Key son probablemente lo más parecido a lo verdaderamente aleatorio que encontrará.

2) Sí, la función está disponible en todos los procesadores Intel que aparecen en computadoras portátiles, computadoras de escritorio y servidores, comenzando con los procesadores Ivy Bridge que usted menciona. En estos días, las funciones también se implementan en chips AMD.

3 y 4) La guía de desarrollo de software de Intel es el lugar para buscar estas respuestas. Existe una interesante discusión sobre cómo se aplica Intel Secure Key a un problema astrofísico aquí ( http://iopscience.iop.org/article/10.3847/1538-4357/aa7ede/meta;jsessionid=A9DA9DDB925E6522D058F3CEEC7D0B21.ip-10-40- 2-120 ) y la versión que no incluye pago con tarjeta aquí ( https://arxiv.org/abs/1707.02212 ). Este documento describe cómo funciona la tecnología, cómo implementarla y describe su desempeño (Secciones 2.2.1 y 5). Tuve que leerlo para una clase.


Desde las revelaciones de PRISM y Snowden, sería muy cuidadoso al usar generadores aleatorios de hardware, o confiar en una sola biblioteca, en una aplicación con problemas de seguridad. Prefiero usar una combinación de generadores aleatorios criptográficos de fuente abierta independientes. Por combinación, quiero decir, por ejemplo: Let''s ra , rb , rc sean tres generadores criptográficos aleatorios independientes, r sea ​​el valor aleatorio devuelto a la aplicación. Vamos a sa , sb , sc sea ​​su semilla, ta , tb , tc , resembrar los períodos ieeg resembrar rb cada tb draw. Por independencia: pertenecer en la medida de lo posible a librerías independientes y confiar en diferentes algoritmos o cifrados.

Pseudo-código:

// init seed std rand with time (at least millisec, preferably microsec) sa = std rand xor time // of course, not the same time evaluation // loop sb = ra every tb sc = rb every tc r = rb xor rc sa = rc every ta

Por supuesto, cada sorteo se usará solo una vez.

Probablemente dos fuentes son suficientes:

// init seed std rand with time (at least millisec, preferably microsec) sa = std rand xor time // of course, not the same time evaluation // loop sb = ra every tb sa = rb every ta r = rb xor ra

Elija diferentes valores para ta, tb, tc. Su rango depende de la fuerza de la fuente aleatoria que use.

EDITAR: he comenzado la nueva biblioteca ABaDooRand para este propósito.


Diseñé el generador de números aleatorios que suministra los números aleatorios a la instrucción RdRand. Entonces, para variar, realmente sé las respuestas.

1) Los números aleatorios se generan a partir de un PRNG que cumple con el estándar SP800-90 AES-CTR DRBG. El AES usa una clave de 128 bits, por lo que los números tienen una resistencia de predicción multiplicativa de hasta 128 bits y un valor aditivo superior a 128.

Sin embargo, el PRNG se vuelve a resembrar de una fuente de entropía completa con frecuencia. Para las instrucciones RdRand aisladas, se resembrará nuevamente. Para 8 hilos en 4 núcleos tirando lo más rápido posible, será resembrado siempre más frecuentemente que una vez por 14 RdRands.

Las semillas provienen de un verdadero generador de números aleatorios. Esto implica una fuente de entropía de 2,5 Gbps que se alimenta a un extractor de entropía de relación de compresión 3: 1 utilizando AES-CBC-MAC.

Por lo tanto, es en efecto un TRNG, pero uno que vuelve a las propiedades de un PRNG criptográficamente seguro para secuencias cortas cuando está muy cargado.

Esta es exactamente la diferencia semántica entre / dev / random y / dev / urandom en Linux, solo que mucho más rápido.

La entropía se obtiene a partir de un proceso cuántico, ya que es el único proceso aleatorio fundamental que conocemos en la naturaleza. En el DRNG es específicamente el ruido térmico en las puertas de 4 transistores que controlan el estado de resolución de un bloqueo metaestable, 2.5 mil millones de veces por segundo.

La fuente y el acondicionador de entropía están diseñados para ser compatibles con SP800-90B y SP800-90C, pero esas especificaciones aún están en borrador.

2) RdRand es una parte del conjunto de instrucciones estándar de Intel. Será compatible con todos los productos de CPU en el futuro.

3) Usted necesita usar un ensamblado en línea o una biblioteca (como openssl) que sí utiliza RdRand. Si usa una biblioteca, la biblioteca está implementando el ensamblador en línea que puede implementar directamente. Intel proporciona ejemplos de código en su sitio web.

Alguien más mencionó librdrand.a. Yo escribí esa. Es bastante simple.

4) Solo busca los códigos de operación RdRand en el binario.