c++ - number - cómo encontrar la entropía "verdadera" de std:: random_device?
random() c++ (4)
Quiero comprobar si mi implementación de std::random_device
tiene una entropía distinta de cero (es decir, no es determinista), usando la función std::random_device::entropy()
. Sin embargo, de acuerdo con cppreference.com
"Esta función no está completamente implementada en algunas bibliotecas estándar. Por ejemplo, gcc y clang siempre devuelven cero aunque el dispositivo no sea determinista. En comparación, Visual C ++ siempre devuelve 32 y boost.random devuelve 10."
¿Hay alguna forma de encontrar la entropía real? En particular, ¿las computadoras modernas (MacBook Pro / iMac, etc.) tienen una fuente o aleatoriedad no determinista, como por ejemplo el uso de monitores de disipación de calor?
La entropía como un término científico es mal utilizada cuando se describen números aleatorios. La complejidad podría ser un mejor término. La entropía en física se define como el logaritmo del número de estados cuánticos disponibles (no es útil en RNG), y la entropía en la teoría de la información está definida por la entropía de Shannon, pero está orientada hacia el otro extremo: cómo poner tanta información en un flujo de bits ruidoso, no cómo minimizar la información.
Por ejemplo, los dígitos de Pi parecen aleatorios, pero la entropía real de los dígitos es cero una vez que se sabe que derivan de Pi. Aumentar la "Entropía" en RNG es básicamente una cuestión de hacer que la fuente de los números sea lo más oscura posible.
La entropía es solo una medida de la calidad del RNG (y la entropía verdadera y exacta es imposible de medir). Para una medición práctica y razonablemente precisa de la calidad del número aleatorio de su std::random_device
, considere el uso de un conjunto de pruebas de aleatoriedad estándar como TestU01 , TestU01 o su sucesor dieharder . Estos ejecutan una batería de pruebas estadísticas diseñadas para enfatizar su RNG, lo que garantiza que produzca datos estadísticamente aleatorios.
Tenga en cuenta que la aleatoriedad estadística por sí misma no certifica que el RNG sea adecuado para aplicaciones criptográficas.
Muchas computadoras modernas tienen fuentes de aleatoriedad de hardware fácilmente accesibles, es decir, los convertidores analógico a digital que se encuentran en la entrada de audio, la cámara y varios sensores. Estos exhiben un ruido térmico o eléctrico de bajo nivel que puede ser explotado para producir datos aleatorios de alta calidad. Sin embargo, ningún sistema operativo que conozca en realidad utiliza estos sensores para suministrar fuentes de números aleatorios de su sistema (como /dev/[u]random
), ya que la tasa de bits de tales fuentes de números aleatorios físicos tiende a ser muy baja.
En cambio, las fuentes de números aleatorios proporcionadas por el SO tienden a ser sembradas por contadores de hardware y eventos, como fallas de página, eventos de controladores de dispositivos y otras fuentes de impredecibilidad. En teoría, estos eventos podrían ser totalmente predecibles dado el estado preciso del hardware (ya que no se basan en, por ejemplo, ruido cuántico o térmico), pero en la práctica son lo suficientemente impredecibles como para producir buenos datos aleatorios.
Te recomiendo la conferencia de este artículo.
§ 26.5.6
Un generador de números aleatorios uniformes de random_device produce números aleatorios no determinísticos.
Si las limitaciones de la implementación impiden generar números aleatorios no deterministas, la implementación puede emplear un motor de números aleatorios.
Así que, básicamente, intentará utilizar el generador de números aleatorios "verdadero" del sistema interno, en linux / dev / {u} random o windows RltGenRandom.
Un punto diferente es que no confías en esas fuentes de aleatoriedad porque dependen del ruido interno o son implementaciones cercanas.
Además, es cómo se mide la calidad de la entropía, ya que uno de los mayores problemas consiste en encontrar buenos generadores de rng.
Una estimación podría ser extremadamente buena y otra estimación podría informar una entropía no tan buena.
Estimación de Entropía
En varias aplicaciones de ciencia / ingeniería, como el análisis de componentes independientes, análisis de imágenes, análisis genéticos, reconocimiento de voz, aprendizaje múltiple y estimación del tiempo de demora, es útil estimar la entropía diferencial de un sistema o proceso, dadas algunas observaciones.
Como es de esperar, debes confiar en las observaciones finales, y esas pueden ser incorrectas.
Creo que el rng interno no es lo suficientemente bueno, siempre puedes intentar comprar dispositivos de hardware para ese fin. Esta lista en wikipedia tiene una lista de proveedores, puede consultar las reseñas en Internet sobre ellos.
Actuación
Un punto que debe considerar es el rendimiento dentro de su aplicación utilizando generadores de números aleatorios reales. Una técnica común es usar como semilla en un tornado mersenne un número obtenido usando / dev / random.
Si el usuario no puede acceder a su sistema físicamente, necesitará equilibrar la confiabilidad con la disponibilidad, un sistema con agujeros de seguridad es tan malo como que uno no funciona, al final debe tener sus datos importantes encriptados.
Editar 1: como sugerencia, he movido el artículo en la parte superior de mi comentario, es una buena lectura. Gracias por la pista :-).
Todo lo que el estándar le da es lo que ya ha visto. Necesitaría saber algo sobre cómo una biblioteca estándar determinada implementa el random_device
para responder a esta pregunta. Por ejemplo, en Visual Studio 2013 Update 4, random_device
reenvía a rand_s
que lo reenvía a RtlGenRandom
, que en realidad puede ser (¿siempre?) Un generador de números pseudoaleatorios criptográficamente seguro dependiendo de su versión de Windows y el hardware disponible.
Si no confías en la plataforma para proporcionar una buena fuente de entropía, entonces debes usar tu propio PRNG criptográficamente seguro, como uno basado en AES. Dicho esto, los proveedores de plataformas tienen grandes incentivos para que sus números aleatorios sean aleatorios, e incorporar el PRNG a su aplicación significa que el PRNG no se puede actualizar tan fácilmente en caso de que se descubra que es inseguro. Solo tú puedes decidir sobre esa compensación por ti mismo :)