domingo, 17 de mayo de 2015

Números pseudo aleatorios en microcontroladores

Los números aleatorios son importantes para temas como el encriptado de información y la generación de claves de acceso.
El obtener números aleatorios no es algo trivial, y para ello se requiere utilizar principios físicos como el ruido presente en componentes y circuitos electrónicos. Algo que por lo general es indeseable, en este caso tiene una utilidad práctica.
Si no contamos con circuitos externos no podemos obtener números aleatorios verdaderos.
Por lo general todos los compiladores incluyen un función que permite generar números pseudoaleatorios, es decir números que se aproximan pero no son estadísticamente aleatorios verdaderos. Estas funciones generan secuencias de números que después de cierto tiempo se repiten.
Como la generación de números aleatorios o pseudoaleatorios es importante para temas de seguridad, se han hecho muchos estudios al respecto, y hay disponible una gran cantidad de algoritmos en internet.
Es evidente que un algoritmo es mejor mientras la secuencia de números que genere esté mejor distribuida desde el punto de vista estadístico.
Uno de los algoritmos disponibles lo podemos ver en este programa en CCSC C para el micro 16F628A:



EL programa genera números enteros pseudoaleatorios de 32bits y el equivalente de punto flotante en el rango (0,1).
Si invocamos la función random1()  con un parámetro distinto a 0, este valor se toma como la semilla (seed).
Podemos ver que en la subrutina init() invocamos la función y utilizamos como parámetro el valor del timer 0, de esta forma nos aseguramos que cada vez que el circuito empieza a funcionar la semilla, y la sequencia de números generados, es diferente.
El valor de la semilla es muy importante, por lo que se han ideado muchos procedimientos para una selección de la misma. Además de la lectura del reloj interno podemos mencionar:
  • Al inicio leer una posición de memoria ram: En principio el valor no es predecible.
  • Guardar en memoria eeprom el valor del reloj interno al ocurrir algún envento específico (por ejemplo la lectura de información por el puerto serial). Al inicio se lee este valor y se utiliza como semilla.
Podemos ver una imagen donde tenemos cuatro sets de números : int32 y punto flotante generados por el algoritmo y un entero generado por la función incluida en el compilador.


La ventaja del algoritmo en relación a la función incluida en el compilador es que en lugar de generar un número entero de 16bits tenemos uno de 32bits, lo cual, en principio, nos asegura que la secuencia de números disponibles es mayor antes de que la misma se repita.

No hay comentarios:

Publicar un comentario