Eu li uma nota de aplicativo da TI ( slaa338 ) que descreve uma técnica para gerar números aleatórios "de verdade" (em oposição a "pseudo"). Ele explora o subsistema de relógio um tanto exótico do MSP430 para atingir esse objetivo. Alguém sabe de uma técnica que pode ser implementada em um AVR (estou interessado no XMega, em particular) para gerar números aleatórios "de verdade"?
avr
xmega
random-number
vicatcu
fonte
fonte
Respostas:
Quão ruim você usa o XMega? Se a geração criptográfica e de números aleatórios é uma grande parte do seu projeto, a série SecureAVR da Atmel possui um número aleatório de hardware embutido e foi projetado para aplicativos criptográficos.
Independentemente disso, duvido que você encontre uma fonte de semente aleatória que tenha uma boa distribuição. Você desejará executá-lo através de um gerador de números pseudo-aleatórios algumas vezes. Desde que você comece com uma semente diferente a cada vez, isso fornecerá um bom conjunto de números aleatórios. Um LGC é um gerador pseudo-aleatório rápido e fácil:
fonte
Conecte o ADC a uma fonte de ruído de hardware e use o software para "embranquecer" os números aleatórios, se necessário.
Aqui está um projeto baseado em AVR que faz isso: Mini Gerador de Número Aleatório Portátil de Leon (mPRNG)
Dependendo da segurança criptográfica necessária, você pode usar o ruído de uma entrada analógica aterrada ou o " sensor interno de temperatura " como sua semente de aleatoriedade, em vez de hardware externo.
Atualização : Mais tarde, escrevi um programa para o Arduino que usa os temporizadores do chip como fonte de entropia (o ADC acabou sendo inútil porque os bits ruidosos são truncados) e isso inspirou a criação da biblioteca Entropy .
Nos dois casos, a aleatoriedade não é, por exemplo, o valor da temperatura em si, que muda apenas lentamente, mas dos bits menos significativos , que variam aleatoriamente de uma leitura para a seguinte. Eu li o valor várias vezes, uma vez para cada bit de saída, deslocamento de bits e XOR na leitura anterior. XORing um bit verdadeiramente aleatório com um bit não correlacionado preserva a aleatoriedade , para que a aleatoriedade se espalhe por todos os bits e se torne um verdadeiro ruído branco. Porém, sua taxa de bits não será muito alta, pois você obtém apenas um bit de saída por tempo de aquisição ou ciclo do temporizador. Com o método do timer, eu estava obtendo cerca de 64 bits / s.
fonte
Outro truque para gerar uma semente aleatória é contar o número de ciclos de relógio até um evento externo. Por exemplo, se este é um dispositivo a ser usado por uma pessoa, conte o número de ciclos de relógio até que ele pressione o botão 'ir' e use-o como a semente aleatória.
fonte
Para ter certeza de não reiniciar com a mesma sequência, eu uso somme byte no eeprom:
Isso dá um bom aleatório e não custa muito em programa / memória.
fonte
Eu criei uma biblioteca que, embora o original projetado para o Arduino funcione bem como uma classe em uma implementação de C ++ usando g ++ no avr, de fato ele também foi portado recentemente para a arquitetura ARM.
Utiliza a instabilidade entre o cronômetro do watchdog e o relógio do sistema e foi testado em vários chips diferentes (documentados na página da wiki)
http://code.google.com/p/avr-hardware-random-number-generation/wiki/WikiAVRentropy
fonte
Você já olhou para usar algo como randomSeed () ? - usado no IDE do Arduino
Você pode usar esta função para testar um pino analógico flutuante (gratuito) no atmel AVR e, em seguida, usa o valor para criar um ponto de partida arbitrário para a função de número pseudo- aleatório - random ().
O valor criado por random () pode ser um número pseudo-aleatório - mas o ponto de partida arbitrário criado por randomSeed () deve ser o número / valor aleatório mais real possível.
fonte
Há um artigo sobre como conseguir isso com o hardware AVR. Envolve confiar no jitter do relógio. Basicamente, você usa uma interrupção do timer com base em uma fonte de relógio para amostrar os bits mais baixos de um timer separado, com o clock de uma fonte de relógio independente separada. Os dois relógios terão algum tremor aleatório associado a eles e a amostragem não será perfeitamente periódica.
Eu fiz uma pequena prova de conceito disso em um microcontrolador STM32, o código está no github aqui . Obteve alguns bons resultados com base em um conjunto de conjuntos de testes de randomização.
Na minha opinião, acho que isso é melhor do que amostrar um pino flutuante com um ADC que é extremamente fácil de atacar (amarre o pino no chão e seu número não será mais tão aleatório!). Tenho certeza de que existe uma maneira de manipular um RNG baseado em jitter de clock, mas me sinto um pouco melhor por poder fazer isso puramente com base em fontes de clock interno no chip.
fonte