¿Generadores de números aleatorios usando un pin GPIO?


22

Acabo de leer la pregunta AVR Random Number Generator y encontré varias formas de generar semillas aleatorias en un AVR:

  • Utilice un "AVR seguro" para fines especiales
  • Use un sensor de temperatura interno
  • Leer EEPROM no escrita
  • Medir intervalos de tiempo entre la entrada del usuario
  • Use un pin ADC flotante.

¿Por qué no un solo pin digital, configurado como entrada sin pull-up y flotante? En teoría, eso debería generar un flujo de bits aleatorios. ¿Por qué no usar esto? ¿El estado está cambiando muy lentamente? ¿Tiende a atascarse en 1 o 0? ¿Algún otro problema?


1
Secure AVR está muerto AFAIK
vicatcu

1
¿No es eeprom no escrito siempre 0xFF?
vsz

@vsz, tal vez si le escribes algo y olvidas lo que escribiste, ahora es "aleatorio". jajaja
Vorac

Respuestas:


5

"Aleatorio" es una palabra difícil. En algunos contextos, simplemente significa "impredecible", pero en otros contextos, en particular los asociados con el procesamiento de señales y la criptografía, significa "estadísticamente no correlacionado".

Incluso si el valor leído desde un pin flotante es impredecible ("aleatorio" en el primer sentido), no es probable que sea útil en el segundo sentido.


15

La diferencia evidente entre el uso de una entrada digital y una analógica es que existe un mayor rango de valores semilla posibles en analógico.

En segundo lugar, pero quizás más crucial: si el valor "mediano" flotante del pin digital no está precisamente a medio camino entre los niveles de detección lógica (que no son los niveles de potencia y tierra, sino los umbrales de conmutación para el circuito de entrada), el flujo de bits resultante tendrá un fuerte sesgo hacia 1 o 0. Este sesgo sesga las semillas mucho más fuertemente que un sesgo en los niveles analógicos.

Se necesitaría muy poco acoplamiento, ya sea de trazas o señales cercanas, o mediante algún pull-up / pull-down resistivo, ya sea diseñado o accidental, para empujar un pin digital "flotante" para que no se flote, y eso también podría suceder después de despliegue. En la ingeniería de cualquier diseño, es mejor evitar esta forma de modo de falla.


14

Una entrada flotante no está definida. Podría darle bits aleatorios, pero también podría tender a quedarse atascado en 0 o 1. La mayoría de las veces se quedará atascado. Y cuando realmente está flotando, puede causar un aumento en el ruido del sistema y el consumo de energía. Las entradas flotantes generalmente son algo malo, incluso cuando las entradas no se utilizan para nada.


No sólo va a quedar atrapados a 0 ó 1 parte del tiempo, pero a menos que los dos transistores que componen la primera etapa de la entrada de memoria intermedia están PERFECTAMENTE equilibrado, o hay alguna fuente de corriente externa en modo u otro, la entrada será flotar hasta un 1 o hasta un 0 eventualmente.
wjl

9

La solución más simple es construir un circuito generador de señal aleatoria de hardware a partir de un circuito de transistor de colector abierto mal utilizado. Utilice la salida de flujo de bits a una entrada en el microcontrolador. Muestree los bits entrantes a intervalos. Para asegurar un número más o menos par de 1s y 0s, simplemente use el cambio de estado como 1 y no cambie como cero. Google para generador de ruido de transistores para más información.


Interesante. ¿Qué aspecto tiene un "circuito de transistor de colector abierto mal utilizado"?
Stephen Collings

77
@Remiel - Se polariza inversamente la unión base-emisor de un transistor, y actúa como un zener realmente horrible. Toma el zener muy ruidoso y amplifica el ruido para obtener un flujo de bits aleatorio. Ver robseward.com/misc/RNG2
Connor Wolf

3

Un generador aleatorio que está disponible en muchos microcontroladores es el error entre dos fuentes de reloj (quizás una interna y otra externa). Cuando los comparas, se desplazan ligeramente debido al ruido y eso se puede usar.

Al final, ¿para qué lo necesitas? Un poco de aleatorización e incluso puedes usar un pin ADC conectado a nada. O simplemente use un algoritmo como

Twister Mersenne http://en.wikipedia.org/wiki/Mersenne_twister

Ninguno si esto es criptográficamente seguro, pero lo suficientemente bueno para la mayoría de los propósitos.


ese es el enfoque adoptado en la nota de la aplicación msp430 en la pregunta anterior mencionada, que yo sepa, el sistema de reloj AVR no admite esta técnica
vicatcu

Correcto. Todavía debería ser posible hacerlo con la misma fuente de reloj, incluso si no es directamente compatible.
Gustavo Litovsky

3

La calidad de una semilla aleatoria y su algoritmo están determinados por la cantidad de entropía o incertidumbre en cada bit aleatorio. Entonces, el mejor generador de una semilla usa alta entropía con muy pocos pasos en lugar de muchos pasos de baja entropía.

Un buen ejemplo de alta entropía utiliza el método de cuadrados latinos para una semilla aleatoria.

La entrada flotante es fácilmente sesgada por fallas, fugas o ruido de entrada.


0

En un microprocesador PIC18F, debe tener una semilla para el número aleatorio. La semilla puede ser de 0 a 32767 (15 bits). Sugeriría al comienzo del programa que haga uno de los pines y el pin de entrada analógica. Lea este pin y tome el bit menos significativo y póngalo en una variable de 16 bits. Luego, cambie la variable a la izquierda en 1. Lea nuevamente el pin y coloque el LSB del resultado del ADC en el primer bit de la variable en la que almacenó el último bit. Cambie a la izquierda nuevamente .....

Repita esto hasta que tenga 15 bits en su variable. Este es el número que necesita poner en su semilla.

Después de haber hecho esto, puede simplemente hacer que el pin de entrada analógica sea un pin de entrada digital y habilitar un pull up débil, o convertirlo en un pin de salida digital. Cualquiera evitará que este pin flote.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.