Pergunta

Atualmente, impulso única implementa a classe random_device para Linux (talvez * nix) sistemas. Alguém sabe de implementações existentes para outras OS-es? Idealmente, essas implementações seria open-source.

Se não existir nenhum, como eu devo ir sobre a implementação de um RNG não determinística para Windows, bem como Mac OS X? Não existem chamadas de API em qualquer ambiente que iria fornecer essa funcionalidade? Graças (e desculpa para todas as perguntas)!

Foi útil?

Solução

Em MacOSX, você pode usar / dev / random (já que é um * nix).

No Windows, você provavelmente vai querer a função CryptGenRandom. Eu não sei se há uma implementação de boost :: random_device que o utiliza.

Outras dicas

Depende do que você quer usar você RNG para.

Em termos gerais, você vai alimentar os dados de sementes em um buffer, gerar valores hash do buffer, misture um contador para o resultado e haxixe um pouco mais. A razão para usar uma função hash é bom hashes são projetados para produzir resultados aleatórios-olhando a partir de dados de entrada que está mais estruturada.

Se você quiser usá-lo para criptografia, as coisas vão virar um cabeludo muito. Você precisará saltar através de aros mais para garantir que sua RNG mantém padrões de repetição dentro de limites razoáveis ??de segurança. Posso recomendar "Practical Cryptography" de Bruce Schneier (para uma introdução sobre RNG, e uma implementação de exemplo). Ele também tem algumas coisas RNG-relacionado-se sobre a sua yarrow RNG.

Se impulso depende de / dev / random, é possível que ele trabalha em MacOS também (como tem isso).

No Windows há CryptoAPI como parte do sistema operacional, e que proporciona uma RNG qualidade de criptografia.

Além disso, acredito moderno Intel CPUs têm uma RNG hardware no chip - no entanto você tem que descobrir como obter pelo que em cada sistema operacional. Usando as APIs de nível superior é provavelmente a melhor aposta.

Edit: Aqui está um ligação para como funciona a Intel RNG

OpenSSL tem um 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 tem um em Win32. Ela exige mais algumas chamadas de função. Não incluindo os detalhes aqui porque existem 2 a 5 args para cada uma dessas chamadas. Tenha cuidado, CryptoAPI parece exigir que o usuário tenha um perfil local completo (C: \ Documents and Settings \ usuário \ Local Settings) corretamente configurado antes que ele possa dar-lhe um número aleatório

.
CryptAcquireContext // see docs
CryptGenRandom
CryptReleaseContext
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top