Pregunta

Actualmente, Boost solo implementa la clase random_device para sistemas Linux (quizás * nix). ¿Alguien sabe de implementaciones existentes para otros sistemas operativos? Idealmente, estas implementaciones serían de código abierto.

Si no existe ninguno, ¿cómo debo implementar un RNG no determinista para Windows y Mac OS X? ¿Existen llamadas a la API en algún entorno que proporcione esta funcionalidad? Gracias (y perdón por todas las preguntas)!

¿Fue útil?

Solución

En MacOSX, puedes usar / dev / random (ya que es un * nix).

En Windows, es probable que desee la función CryptGenRandom. No sé si hay una implementación de boost :: random_device que la use.

Otros consejos

Depende de para qué quieres usar tu RNG.

En términos generales, alimentarás datos de semilla en un búfer, generarás valores hash del búfer, mezclarás un contador en el resultado y lo harás un poco más. La razón para usar una función hash es que los hashes buenos están diseñados para producir resultados de apariencia aleatoria a partir de datos de entrada que están más estructurados.

Si quieres usarlo para la criptografía, las cosas se volverán mucho más complicadas. Tendrá que saltar más aros para asegurarse de que su RNG siga repitiendo los patrones dentro de límites razonablemente seguros. Puedo recomendar "Criptografía práctica" de Bruce Schneier (para una introducción sobre RNGs, y una implementación de muestra). También tiene algunas cosas relacionadas con el RNG sobre su yarrow RNG.

Si boost se basa en / dev / random, es probable que funcione también en MacOS (como lo tiene).

En Windows hay CryptoAPI como parte del sistema operativo, y eso proporciona un RNG de calidad criptográfica.

También, creo que las modernas CPU de Intel tienen un RNG de hardware en el chip, sin embargo, tendrías que descubrir cómo conseguir eso en cada SO. Utilizar las API de nivel superior es probablemente una mejor apuesta.

edición: aquí hay un enlace sobre cómo funciona Intel RNG

OpenSSL tiene 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 tiene uno en Win32. Requiere algunas llamadas de función más. No se incluyen los detalles aquí porque hay de 2 a 5 argumentos para cada una de estas llamadas. Tenga cuidado, parece que CryptoAPI requiere que el usuario tenga un perfil local completo (C: \ Documents and Settings \ usuario \ Local Settings) configurado correctamente antes de que pueda darle un número aleatorio.

CryptAcquireContext // see docs
CryptGenRandom
CryptReleaseContext
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top