AVR generador de números aleatorios

12

He leído una nota de nota de TI ( slaa338 ) que describe una técnica para generar Números aleatorios "para reales" (en oposición a "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"?

    
pregunta vicatcu

7 respuestas

6

¿Qué tan malo es usar el XMega? Si la generación de números aleatorios y criptográficos son una gran parte de su proyecto, la serie SecureAVR de Atmel tiene un número aleatorio de hardware integrado y está diseñado para aplicaciones criptográficas.

En cualquier caso, dudo que encuentres una fuente de semilla aleatoria que tenga una buena distribución. Querrá ejecutarlo a través de un generador de números pseudoaleatorios unas cuantas veces Siempre que empiece con una semilla diferente cada vez, esto le dará un buen conjunto de números aleatorios. Un LGC es un generador pseudo aleatorio rápido y fácil:

static unsigned long Seed; 

/* Call before first use of NextVal */
unsigned long InitSeed()
{
   //Your code for random seed here

   // Correct distribution errors in seed
   NextVal();
   NextVal();
   NextVal();
   return NextVal();
}

 /* Linear Congruential Generator 
  * Constants from  
  * "Numerical Recipes in C" 
  * by way of 
   * <http://en.wikipedia.org/wiki/Linear_congruential_generator#LCGs_in_common_use>
   * Note: Secure implementations may want to get uncommon/new LCG values
  */
unsigned long NextVal()
{
  Seed=Seed*1664525L+1013904223L;
  return Seed;
} 
    
respondido por el Kevin Vermeer
7

Conecte el ADC a una fuente de ruido de hardware y use el software para "blanquear" los números aleatorios si es necesario.

Aquí hay un proyecto basado en AVR que hace esto: Mini generador de números aleatorios portátil de Leon (mPRNG)

Dependiendo de la seguridad criptográfica que debe tener, puede utilizar el ruido de una entrada analógica con conexión a tierra o el " sensor de temperatura interno " como su semilla de aleatoriedad en lugar de hardware externo.

Actualización : más tarde escribí un programa para Arduino que utiliza los temporizadores del chip como un fuente de entropía (el ADC resultó inútil porque los bits ruidosos están truncados), y esto inspiró la creación de la biblioteca Entropy .

En ambos casos, la aleatoriedad no es, por ejemplo, el valor de la temperatura en sí, que solo cambia lentamente, sino de la menos bits significativos , que varían aleatoriamente de una lectura a la siguiente. Leí el valor varias veces, una vez por cada bit de salida, cambio de bits y XORing con la lectura anterior. XORRAR un bit verdaderamente aleatorio con un bit no correlacionado preserva la aleatoriedad , por lo que la aleatoriedad se extiende a todos los bits y se convierte en verdadero ruido blanco. Sin embargo, su tasa de bits no será muy alta, ya que solo obtendrá un bit de salida por tiempo de adquisición o ciclo de temporizador. Con el método del temporizador, obtenía unos 64 bit / s.

    
respondido por el endolith
4

Otro truco para generar una semilla aleatoria, es contar el número de ciclos de reloj hasta un evento externo. Por ejemplo, si se trata de un dispositivo que debe usar una persona, cuente la cantidad de ciclos de reloj hasta que presione el botón "Ir" y utilícelo como semilla aleatoria.

    
respondido por el davr
3

Para estar seguro de no reiniciar con la misma secuencia, utilizo somme byte en el eeprom:

#include <avr/eeprom.h>
#include <stdlib.h> // rand

u16  EEMEM randinit; 

int main(void) {
        srand(eeprom_read_word(&randinit));
        eeprom_write_word(&randinit,rand());
        [...]
 }

Esto da bastante bien al azar, y no cuesta mucho en el programa / memoria.

    
respondido por el jojo l'abricot
3

He creado una biblioteca que, si bien la original diseñada para Arduino funciona bien como una clase en una implementación de C ++ usando g ++ en el avr, de hecho, recientemente también se ha incorporado a la arquitectura ARM.

Hace uso del jitter entre el temporizador de vigilancia y el reloj del sistema y se ha probado en varios chips diferentes (documentados en la página wiki)

enlace

    
respondido por el Walter Anderson
2

¿Ha considerado usar algo como randomSeed () ? - utilizado en el IDE de Arduino

Puede usar esta función para muestrear un pin analógico flotante (libre) en el AVR de atmel, luego usa el valor para crear un punto de inicio arbitrario para la función de número aleatorio pseudo - random () .

El valor creado por random () puede ser un número pseudoaleatorio, pero el punto de inicio arbitrario creado por randomSeed () debe ser un número / valor aleatorio tan real como sea posible.

    
respondido por el Jim
1

Hay un documento sobre cómo lograr esto con el hardware AVR. Se trata de confiar en el jitter 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 desconecta de una fuente de reloj independiente separada. Los dos relojes tendrán una fluctuación aleatoria asociada a ellos y el muestreo no será perfectamente periódico.

Hice una pequeña prueba del concepto de esto en un microcontrolador STM32, el código es 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 muestrear un pin flotante con un ADC que es extremadamente fácil de atacar (ate 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 el jitter del reloj, pero me hace sentir un poco mejor que puedo hacerlo puramente basado en fuentes de reloj internas en el chip.

    
respondido por el Jon L

Lea otras preguntas en las etiquetas

Comentarios Recientes

Para asegurar la entrada del usuario y evitar ataques de fuerza bruta, puede usar RNGRandom para generar números pseudoaleatorios del 6 0 al 61 1 11 o 160 0 en 3d. La mayoría participa en una secuencia aleatoria de 00000000 a 3BF con jue para 0-7 (esta opción puede anularla). Se recomienda encarecidamente configurar el bit 25 para autogenerar enteros para máquinas gráficas completas. Por lo general, el nombre completo del programa tiene al menos 8 bytes, pero 16 y 32 también funcionarán. Para mover la configuración... Lees verder