Pergunta

Ok, eu acho que isso é totalmente subjetiva e outros enfeites, mas eu estava pensando em fontes de entropia para geradores de números aleatórios. Ele diz que a maioria dos geradores são semeados com a hora atual, correto? Bem, eu estava curioso para saber o que as outras fontes poderiam ser usados ??para gerar aleatório (a definição frouxa) números perfeitamente válidas,.

faria usando várias fontes (como hora + atual HDD tempo de busca [Estamos sendo fantástico aqui]), juntos, criar um número "mais aleatória" do que uma única fonte? Quais são os limites lógicos da quantidade de fontes? Quanto é realmente suficiente? É o tempo escolhido simplesmente porque é conveniente?

Desculpe-me se esse tipo de coisa não é permitido, mas estou curioso para saber a teoria por trás das fontes.

Outras dicas

SGI vez fotos usadas de uma lâmpada de lava em várias "fases glob" como fonte de entropia, que eventualmente evoluiu para um gerador de números aleatórios de código aberto chamado LavaRnd .

Eu uso Random.ORG , eles fornecem dados aleatórios livre de ruído atmosférica, que eu uso para periodicamente re-semente um Mersene-tornado RNG. Sua sobre tão aleatório como você pode obter sem dependências de hardware.

Não se preocupe com um "bom" semente por um gerador de números aleatórios. As propriedades estatísticas da sequência não dependem de como o gerador é semeada. Há outras coisas, no entanto. se preocupar com. Consulte Armadilhas na geração de números aleatórios .

Quanto ao hardware geradores de números aleatórios, essas fontes físicas tem que ser medido, e o processo de medição tem erros sistemáticos. Você pode achar "pseudo" números aleatórios para ter maior qualidade do que números aleatórios "reais".

Linux kernel do dispositivo usa interrupção timing (mouse, teclado, unidades de disco rígido) para gerar entropia. Há uma boa artigo na Wikipedia sobre entropia.

RNG modernos estão marcadas contra correlações em sementes próximas e executar várias centenas de iterações após a semeadura. Portanto, a resposta infelizmente chato, mas é verdade é que ele realmente não importa muito.

De um modo geral, usando processos físicos aleatórios tem que ser verificada a sua conformidade com uma distribuição uniforme e são outra forma retificada.

Na minha opinião, muitas vezes é melhor usar um gerador de números pseudo-aleatórios muito bem compreendido.

Eu usei um programa de criptografia que usou o movimento usuários mouse para gerar números aleatórios. O único problema era que o programa teve que parar e perguntar ao usuário mover o mouse ao redor aleatoriamente por alguns segundos para funcionar corretamente que pode não ser sempre prático.

HotBits há vários anos - os números são gerados a partir de decaimento radioativo, genuinamente aleatória números.

Existem limites para quantos números você pode baixar um dia, mas sempre me divertiu para usá-los como realmente, sementes realmente aleatórios para RNG.

Alguns TPM (Trusted Platform Module) "chips" têm uma RNG hardware. Infelizmente, o TPM (Broadcom) no meu laptop Dell não tem esse recurso, mas muitos computadores vendidos hoje vêm com uma RNG hardware que usa verdadeiramente imprevisível quântica processos mecânicos. Intel tem implementado a variedade ruído térmico.

Além disso, não use o tempo atual só para semear uma RNG para fins criptográficos, ou qualquer outra aplicação onde a imprevisibilidade é importante. Usando alguns bits de baixa ordem a partir do momento em conjunto com várias outras fontes é provavelmente bem.

A semelhante pergunta pode ser útil para você.

Desculpe o atraso a esta discussão (o que é 3 1/2 anos de idade agora?), Mas eu tenho um renovado interesse na geração de PRN e fontes alternativas de entropia. Linux kernel do desenvolvedor Rusty Russell recentemente teve uma discussão em seu blogue em fontes alternativas de entropia (outra que /dev/urandom).

Mas, eu não sou tudo o que impressionado com as suas escolhas; endereço MAC de uma placa de rede nunca muda (embora seja única de todos os outros), e PID parece ser um tamanho de amostra muito pequena possível.

Já se envolveu com um Mersenne Twister (na minha caixa de Linux), que é semeado com o seguinte algoritmo. Eu estou pedindo quaisquer comentários / feedback se dispostos e interessados ??de qualquer pessoa:

  1. Criar um tampão de matriz de 64 bits 256 bits + * número de ficheiros /proc abaixo.
  2. Coloque o contador de selo de tempo (TSC) valor nos primeiros 64 bits deste tampão.
  3. Para cada um dos seguintes arquivos /proc, calcular a soma SHA256:

    • /proc/meminfo
    • /proc/self/maps
    • /proc/self/smaps
    • /proc/interrupts
    • /proc/diskstats
    • /proc/self/stat

      Local cada valor hash de 256 bits para a sua própria área da matriz criada em (1).

  4. Criar um hash SHA256 de todo esse buffer. NOTA:. Eu poderia (e provavelmente deve) usar uma função hash diferente completamente independente das funções SHA - esta técnica tem sido proposta como uma "salvaguarda" contra hash funções fracos

Agora tenho 256 bits de Oxalá (bastante) de dados aleatórios entropia para semear meu Mersenne Twister. Eu uso o acima para preencher o início da matriz MT (624 de 32 bits inteiros), e, em seguida, inicializar o restante do array com o código do autor MT. Além disso, eu poderia utilizar uma função hash diferente (por exemplo SHA384, SHA512), mas seria necessário um tampão de matriz de tamanho diferente (obviamente).

O código original Mersenne Twister chamado para uma semente de 32 bits único, mas eu sinto que é terrivelmente inadequada. Correndo "apenas" 2 ^ 32-1 MTs diferentes em busca de quebrar a criptografia não é além do reino da possibilidade prática neste dia e idade.

Eu adoraria ler o feedback de alguém sobre isso. A crítica é mais do que bem-vindo. Eu vou defender o meu uso dos arquivos /proc como acima porque eles estão mudando constantemente (especialmente os arquivos /proc/self/*, ea TSC sempre produz um valor diferente (nanossegundo [ou melhor] resolução, IIRC). Já corri testes Diehard sobre isso (da ordem de várias centenas de bilhão bits), e parece estar passando com distinção. Mas isso é provavelmente mais prova da solidez da Mersenne Twister como um PRNG do que como eu estou semeando-lo.

É claro, estes não totalmente impermeável a alguém cortar-los, mas eu simplesmente não consigo ver tudo isso (e SHA *) sendo cortado e quebrado são no meu tempo de vida.

Alguns entrada uso do teclado (tempos de espera entre as teclas digitadas), ouvi de eu penso em um romance que a recepção de rádio estática pode ser usado - mas é claro que requer outro hardware e software ...

Noise no topo do espectro de radiação cósmica de fundo. Claro que você deve primeiro remover alguns anisotropia, objetos em primeiro plano, o ruído detector correlacionada, galáxia e velocidade de grupo locais, polarizações etc. Muitos armadilhas permanecem .

Fonte de sementes não é muito importante. Mais importante é o algoritmo gerador de números pseudo. No entanto eu ouvi há algum tempo sobre a geração de semente para algumas operações bancárias. Eles levaram muitos fatores juntos:

  • tempo
  • temperatura do processador
  • velocidade do ventilador
  • cpu tensão
  • Não me lembro mais:)

Mesmo que alguns destes parâmetros não muda muito com o tempo, você pode colocá-los em uma boa função hash.

Como gerar bom número aleatório?

Talvez possamos ter em conta inifinite número de universos? Se isso é verdade, que todos os novos universos paralelos do tempo estão sendo criados, podemos fazer algo como isto:

int Random() {
    return Universe.object_id % MAX_INT;
}

Em cada momento que deve ser em outro ramo de universos paralelos, de modo que devemos ter diferentes id. O único problema é como obter Universo objeto:)

Como cerca de cisão um segmento que irá manipular alguma variável dentro de um loop para um determinado período de tempo antes de ser morto. O que você acabar com dependerá da velocidade do processador, a carga do sistema, etc ... Muito piegas, mas é melhor do que apenas srand (time (NULL)) ...

Não se preocupe com um "bom" semente por um gerador de números aleatórios. As propriedades estatísticas da seqüência não depender de como o gerador é semeado.

Eu discordo com o conselho John D. Cook . Se você semear o Mersenne Twister com todos os bits definidos para zero, exceto um, que inicialmente irá gerar números que são tudo menos aleatória. É preciso um longo tempo para o gerador a produzir este estado em qualquer coisa que possa passar por testes estatísticos. Simplesmente definindo os primeiros 32 bits do gerador a uma semente terá um efeito semelhante. Além disso, se o estado inteiro está definido para zero o gerador irá produzir zeros intermináveis.

código RNG corretamente escrita terá um algoritmo de semeadura escrito corretamente que aceita dizer um valor de 64 bit e sementes do gerador para que ele irá produzir números aleatórios decentes para cada entrada possível. Então, se você estiver usando uma biblioteca confiável, então qualquer semente vai fazer. Mas se você cortar juntos sua própria implementação, então você precisa ter cuidado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top