7 votos

Fuente de entropía en Microchip PIC24F

Estoy trabajando para desarrollar un hardware accesorio para Android. Actualmente, estoy tratando de generar un número aleatorio (lenguaje C) en un sistema embebido, pero el valor no cambia. Me pregunto si hay alguna fuente de entropía que pueda utilizar para generar números aleatorios.

Si hay otra forma de generar números aleatorios que no sea la de la entropía, ¡me gustaría mucho que me lo dijeras!

El software que estoy utilizando:

IDE MPLAB Versión 8.73 Compilador MPLAB C para PIC24 y dsPIC v3.30

Dispositivo/herramientas que utilizo:

DM240415 - Kit de inicio de desarrollo de accesorios PIC24F para Android

12voto

lillq Puntos 4161

"Cualquiera que considere métodos aritméticos para producir dígitos aleatorios está, por supuesto, en estado de pecado" \$-\$ John Von Neumann

Una buena fuente de ruido es el ruido de ruptura de un diodo zener. El sencillo esquema siguiente muestra cómo obtener ruido blanco de un zener conectando en cascada dos LNA (amplificadores de bajo ruido) para aumentar el nivel de ruido.

white noise generator

Si no te importa que el ruido sea blanco puedes utilizar simplemente un amplificador opamp con una gran amplificación, con un comparador siguiéndolo. La amplificación del amplificador óptico limita el ancho de banda y, por tanto, la velocidad de cambio de la señal digital. Si es necesario, conecta en cascada dos opamps como los LNAs en el esquema dado para obtener un flujo de bits aleatorios más rápido.

Puedes utilizar el módulo SPI para introducir bytes de bits aleatorios desde este circuito.
(El SPI es sólo una forma sencilla de recoger automáticamente 8 bits aleatorios, no añade ningún nivel de determinismo: la entrada cambia continua y aleatoriamente y nunca se sabe cuál será en el siguiente flanco de reloj. También puedes leer un pin de E/S y desplazar el nivel de ese bit a tu byte de resultado).

Este circuito es una posible solución alternativa, que también se basa en un diodo zener como fuente de ruido:

random bit circuit

El esquema menciona el OPA2340 para el amplificador, pero no está claro en el comparador. Mientras que el OPA2340 es razonablemente rápido yo sugeriría utilizar un comparador real ya que suelen ser mucho más rápidos que los opamps. Por ejemplo, el TL3016 tiene un retardo de propagación inferior a 10 ns y un tiempo de subida típico de 0,5 ns. Esto significa que puedes muestrear valores aleatorios más rápidamente sin riesgo de coherencia entre muestras sucesivas.

Para comprobar el generador de números aleatorios, puede comprobar lo siguiente normalidad . Esto significa crear una larga cadena de números aleatorios, cuanto más larga mejor. Lo mejor es transportarla al PC para el análisis. Contar las secuencias de un bit, esa es la 0 s y 1 s. Debería haber aproximadamente el mismo número de cada una. Repite la operación para secuencias de dos bits. Debería haber tantos 00 s como 01 s, 10 s y 11 s. Repetir para secuencias de tres bits, etc.
No soy estadístico, así que puede que haya pruebas mejores o más sencillas. No dude en añadirlas.


pseudo random number generator

4voto

Simon Gillbee Puntos 366

No estás usando un PIC24FJ256GB110, que tiene este aspecto:

TQFP-100, not necessarily PIC24FJ256GB110

Estás usando un kit de inicio de Android:

picture of board

que, como comprenderás, es una placa de circuito impreso bastante fija: no estás diseñando la placa de circuito impreso, y un vistazo rápido a la esquema no reveló mucho que se construyó para o podría ser reutilizado como una fuente de entropía de hardware, a excepción de algunas trazas ADC que podrían funcionar como antenas como sugiere Matt .

Sin embargo, suponiendo que estés interactuando con un dispositivo Android, tienes tres fuentes potenciales de ruido aleatorio:

  1. Podrías medir los tiempos precisos de las comunicaciones asíncronas o de las comunicaciones que se producen en Android, y utilizar los bits inferiores de esta medición como fuente de entropía. Tenga en cuenta, por supuesto, que esto podría ser engañado mediante el control preciso del dispositivo Android, y por lo tanto no es adecuado para aplicaciones de seguridad.
  2. Utiliza los bits inferiores de las lecturas del ADC para generar algo de ruido aleatorio. Tienes varias trazas flotantes, así que esto debería obtener resultados impredecibles.
  3. ¡Tienes conectores para un escudo Arduino! Esto significa que puedes añadir todo tipo de hardware, como las soluciones propuesto por Steven , este escudo o los propuestos en esta pregunta . Sí, esto requerirá hardware externo.

Sin embargo, ten en cuenta que la seguridad criptográfica y la verdadera aleatoriedad son cosas difíciles. Parece que necesitas leer un poco más antes de intentar producir algo en lo que la gente pueda confiar, o podrías meterte en serios problemas.

3voto

user4245 Puntos 324

El problema de los generadores de números pseudoaleatorios es que no lo son. Generan una secuencia de números a partir de un punto de partida conocido. Esto suele ser suficientemente aleatorio para la mayoría de los usos de bajo nivel, pero no si eres consciente de la seguridad, o quieres que más de un sistema interactúe sin colisiones (por ejemplo, redes).

Así que sí, como bien dices, quieres una fuente de entropía. Esto se puede utilizar para establecer la "semilla" del generador de números aleatorios en un valor desconocido. Como sólo se fija la semilla y no se generan realmente los números aleatorios, la entropía sólo tiene que utilizarse una vez, por lo que puede ser bastante "pesada" en cuanto a ciclos de reloj. Puede ejecutarse una vez al iniciar el sistema, y a partir de entonces no debería ser necesario ejecutarlo nunca más.

La mayor parte de la entropía se recoge (¿se cosecha?) de las interrupciones y otras fuentes externas. La primera idea que se me ocurre es dejar una entrada flotante (¿quizá analógica?) con un trozo de pista conectado a ella para que actúe como antena. Esto debería alternar de forma bastante aleatoria entre valores, que puedes usar para crear un valor numérico del orden correcto para sembrar tu generador de números pseudoaleatorios.

Otra idea podría ser tener algún tipo de transductor conectado a esa entrada para que pueda recoger de forma fiable el "ruido" que se utilizará como fuente de entropía. Podría ser cualquier cosa, desde un simple micrófono y un amplificador óptico hasta un par de amplificadores ópticos conectados para obtener una ganancia enorme y, por tanto, una salida de ruido blanco. Hay un gran número de posibles fuentes de ruido en un circuito, dependiendo de lo que tengas a tu disposición en cuanto a espacio y presupuesto.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X