He leído una nota de aplicación de TI ( slaa338 ) que describe una técnica para generar números aleatorios "reales" (en lugar de "pseudo"). Explota el subsistema de reloj algo exótico del MSP430 para lograr este objetivo. ¿Alguien sabe de una técnica que se pueda implementar en un AVR (estoy interesado en los XMega en particular) para generar números aleatorios "reales"?
avr
xmega
random-number
vicatcu
fuente
fuente
Respuestas:
¿Qué tan malo es usar el XMega? Si la generación de números criptográficos y aleatorios es una gran parte de su proyecto, la serie SecureAVR de Atmel tiene incorporado un número aleatorio de hardware y está diseñado para aplicaciones criptográficas.
De todos modos, dudo que encuentre una fuente de semilla aleatoria que tenga una buena distribución. Querrá ejecutarlo a través de un generador de números pseudoaleatorios varias veces Siempre que comience con una semilla diferente cada vez, esto le dará un buen conjunto de números aleatorios. Un LGC es un generador pseudoaleatorio rápido y fácil:
fuente
Conecte el ADC a una fuente de ruido de hardware y use software para "blanquear" los números aleatorios si es necesario.
Aquí hay un proyecto basado en AVR que hace esto: Mini generador portátil de números aleatorios de Leon (mPRNG)
Dependiendo de cuán criptográficamente seguro deba ser, puede usar el ruido de una entrada analógica con conexión a tierra o el " sensor de temperatura interno " como semilla de aleatoriedad en lugar de hardware externo.
Actualización : más tarde escribí un programa para Arduino que usa los temporizadores del chip como fuente de entropía (el ADC resultó inútil porque los bits ruidosos se truncan), y esto inspiró la creación de la biblioteca Entropy .
En ambos casos, la aleatoriedad no proviene, por ejemplo, del valor de la temperatura en sí, que solo cambia lentamente, sino de los bits menos significativos , que varían aleatoriamente de una lectura a la siguiente. Leí el valor varias veces, una vez por cada bit de salida, desplazamiento de bits y XORing con la lectura anterior. XORing un bit verdaderamente aleatorio con un bit no correlacionado conserva la aleatoriedad , por lo que la aleatoriedad se extiende a todos los bits y se convierte en un verdadero ruido blanco. Sin embargo, su velocidad de bits no será muy alta, ya que solo obtiene un bit de salida por tiempo de adquisición o ciclo de temporizador. Con el método del temporizador, estaba obteniendo aproximadamente 64 bit / s.
fuente
Otro truco para generar una semilla aleatoria es contar el número de ciclos de reloj hasta un evento externo. Por ejemplo, si este es un dispositivo para ser usado por una persona, cuente la cantidad de ciclos de reloj hasta que presione el botón 'ir' y úselo como semilla aleatoria.
fuente
Para asegurarme de no reiniciar con la misma secuencia, uso el byte somme en el eeprom:
Esto da bastante buena al azar, y no cuesta mucho en programa / memoria.
fuente
He creado una biblioteca que, si bien el diseño original para Arduino funciona bien como clase en una implementación de C ++ usando g ++ en avr, de hecho, también se ha portado recientemente a la arquitectura ARM.
Utiliza la fluctuación de fase entre el temporizador de vigilancia y el reloj del sistema y se ha probado en varios chips diferentes (documentado en la página wiki)
http://code.google.com/p/avr-hardware-random-number-generation/wiki/WikiAVRentropy
fuente
¿Has visto usar algo como randomSeed () ? - utilizado en el IDE Arduino
Puede utilizar esta función para probar una (libre) pin analógico flotando en el Atmel AVR, entonces se utiliza el valor de crear un punto de partida arbitrario para el seudo función de números aleatorios - aleatorio ().
El valor creado por random () puede ser un número pseudoaleatorio, pero el punto de partida arbitrario creado por randomSeed () debe ser un valor / número aleatorio tan real como sea posible.
fuente
Hay un documento sobre cómo lograr esto con el hardware AVR. Implica confiar en la fluctuación del reloj. Básicamente, utiliza una interrupción de temporizador basada en una fuente de reloj para muestrear los bits más bajos de un temporizador separado que se sincroniza con una fuente de reloj independiente. Los dos relojes tendrán alguna fluctuación aleatoria asociada a ellos y el muestreo no será perfectamente periódico.
Hice una pequeña prueba de concepto de esto en un microcontrolador STM32, el código está en github aquí . Obtuvo algunos buenos resultados basados en un conjunto de conjuntos de pruebas de aleatorización.
En mi opinión, creo que esto es mejor que probar un pin flotante con un ADC que es extremadamente fácil de atacar (¡ata el pin al suelo y tu número ya no es tan aleatorio!). Estoy seguro de que hay una manera de manipular un RNG basado en fluctuación de reloj, pero me hace sentir un poco mejor que puedo hacer esto puramente basado en fuentes de reloj internas en chip.
fuente