Fuente de entropía en Microchip PIC24F

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

Si hay otra forma de generar números aleatorios que no sea usar una forma de entropía, ¡me gustaría mucho saberlo de usted!

El software que estoy usando:

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

El dispositivo/herramientas que estoy usando:

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

¿Qué quieres decir con "el valor no cambia"? ¿Simplemente emite 9 cada vez que lo llamas?
Ejemplo cuando ejecuto un generador aleatorio para generar una matriz de enteros aleatorios. El valor es el mismo al principio sin importar cuántas veces lo ejecute. Por ejemplo, matriz[1] = 4; Matriz[2] = 49; Matriz[3] = 22; Matriz[4] = 91; Matriz[5] = 33; ...
@Ezylryb: parece un PRNG mal diseñado. Un PRNG siempre produce la misma secuencia, pero por lo general se basan en un evento verdaderamente aleatorio para determinar en qué parte de la secuencia comienza. Este evento aleatorio a menudo se deriva del momento en que se lleva a cabo una acción del usuario, como cuando se presiona un botón. El valor de un temporizador de funcionamiento libre se puede utilizar como semilla para el PRNG. Aparentemente, su PRNG siempre comienza con el mismo valor inicial.
¿Está utilizando los valores aleatorios en una aplicación criptográfica? ¿Está utilizando los valores aleatorios en un sistema de juego? En otras palabras, ¿funcionaría mal el producto y/o el usuario sufriría un daño grave si alguien sabe/puede predecir los números aleatorios?
¡Bingo! Estoy usando algún valor aleatorio en una aplicación criptográfica pero no estoy desarrollando ningún sistema de apuestas. Hasta cierto punto, sí. El usuario puede resultar dañado si alguien puede predecir los números aleatorios @Dr X
En ese caso, debe tener mucho cuidado con las propiedades de su RNG. La buena noticia es que puedes hacer mucho con el software. Un buen punto de partida es en.wikipedia.org/wiki/Hardware_random_number_generator , presta especial atención a la sección "tratar con sesgo" y "problemas".

Respuestas (3)

“Cualquiera que considere métodos aritméticos para producir dígitos aleatorios está, por supuesto, en un estado de pecado” Juan Von Neumann

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

generador de ruido blanco

Si no le importa que el ruido sea blanco, simplemente puede usar un amplificador operacional con una amplificación alta, seguido de un comparador . La amplificación del opamp pone un límite al ancho de banda y, por lo tanto, a la tasa de cambio en su señal digital. Si es necesario, conecte en cascada dos amplificadores operacionales como los LNA en el esquema dado para obtener un flujo de bits aleatorio más rápido.

Puede usar el módulo SPI para registrar bytes de bits aleatorios de este circuito.
(El SPI es solo una forma simple de recopilar automáticamente 8 bits aleatorios, no agrega ningún nivel de determinismo: la entrada cambia de forma continua y aleatoria y nunca se sabe qué será en el próximo borde del reloj. También puede leer un pin de E/S y cambie el nivel de ese bit a su byte de resultado).

Este circuito es una posible solución alternativa, apoyándose también en un diodo zener como fuente de ruido:

circuito de bit aleatorio

El esquema menciona el OPA2340 para el amplificador, pero no está claro en el comparador. Si bien el OPA2340 es razonablemente rápido, sugeriría usar un comparador real aquí, ya que estos suelen ser mucho más rápidos que los amplificadores operacionales. Por ejemplo, el TL3016 tiene un retraso de propagación de menos de 10 ns y un tiempo de subida típico de 0,5 ns. Esto significa que puede muestrear valores aleatorios más rápido sin el riesgo de coherencia entre muestras sucesivas.

Para probar el generador de números aleatorios, puede probar la normalidad . Esto significa crear una larga cadena de números aleatorios, cuanto más larga, mejor. Lo mejor es transportarlo a la PC para el análisis. Cuente las secuencias de un bit, esas son las 0s y 1s. Debe haber aproximadamente el mismo número de cada uno. A continuación, repita para secuencias de dos bits. Debe haber tantas 00s como 01s, 10s y 11s. Repita para secuencias de tres bits, etc.
No soy estadístico, por lo que puede haber pruebas mejores/más fáciles. Siéntase libre de agregarlos.


generador de números pseudoaleatorios

Debido a la limitación de PIC24FJ256GB110, el ruido blanco es imposible a menos que agregue un hardware adicional. Mencionas SPI para reloj bytes de bits aleatorios. ¿Es este un número verdaderamente aleatorio? o se basa en un algoritmo para generar el número aleatorio
@Ezylryb: esto debería darte un buen número aleatorio. Solo asegúrese de que haya suficientes transiciones de nivel en un ciclo de reloj SPI. Para probar la aleatoriedad, puede ejecutar pruebas estadísticas. No soy un experto, pero creo que probar la normalidad en una secuencia larga podría ser una buena prueba.
@Ezylryb: sin el hardware adicional que se muestra en cualquiera de los circuitos aquí, el puerto SPI no generará números verdaderamente aleatorios. No estoy seguro de que tuviéramos claro eso.
@Kevin Vermeer Entonces, el módulo SPI de números aleatorios también se basa en un algoritmo matemático y no es realmente aleatorio a través de la entropía. Hm... Parece que no hay forma de generar verdaderamente aleatorio en PIC24FJ256GB110
@Ezylryb: el módulo SPI tiene muy poco que ver con la generación de números aleatorios, es solo una buena manera de obtener datos de los generadores de números aleatorios descritos anteriormente. También podría usar una entrada digital para leer el estado de la salida de los circuitos anteriores.
Parecería que no hay forma de generar números verdaderamente aleatorios solo en el microcontrolador, sí. Sin embargo, es muy inusual estar restringido solo al IC; el PIC24 (y puede llamarlo así, no es necesario especificar FJ256GB110) no es capaz de hacer mucho sin hardware adicional. Oh, espera, seguí el enlace al IC, ¡estás usando un kit de inicio! Ahora tiene sentido.
Excelente uso del cómic de Dilbert. Creo que es un +1 automático, al igual que XKCD es un +1 automático en MSO.
Me gusta la cita de "John Von Neumann" (¡estuvo flotando en mi mente durante tres días!). Inicialmente, estaba pensando en crear un número aleatorio a través de un algoritmo matemático muy complejo para estar seguro. Pero en el momento en que vi la cita simplemente... . .

No está utilizando un PIC24FJ256GB110, que se ve así:

TQFP-100, no necesariamente PIC24FJ256GB110

Está utilizando un kit de inicio de Android:

imagen del tablero

que, como comprenderá, es una PCB bastante fija: no está diseñando la PCB, y una mirada rápida al esquema no reveló mucho de lo que se construyó o podría reutilizarse como una fuente de entropía de hardware, excepto algunos rastros de ADC que podrían funcionar como antenas como sugirió Matt .

Sin embargo, suponiendo que está interactuando con un dispositivo Android, tiene tres posibles fuentes de ruido aleatorio:

  1. Podría medir los tiempos precisos de las comunicaciones asincrónicas o la comunicación que ocurre en el Android, y usar los bits más bajos de esta medida como fuente de entropía. Tenga en cuenta, por supuesto, que esto podría jugarse controlando con precisión el dispositivo Android, por lo que no es adecuado para aplicaciones de seguridad.
  2. Use los bits más bajos de las lecturas de ADC para generar algo de ruido aleatorio. Tiene varios rastros flotantes, por lo que debería obtener resultados impredecibles.
  3. ¡Tiene encabezados de ruptura en un escudo Arduino! Esto significa que puede agregar todo tipo de hardware, como las soluciones propuestas por Steven , este escudo o las propuestas en esta pregunta . Sí, esto requerirá hardware externo.

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

El problema con 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. Por lo general, esto es lo suficientemente aleatorio para la mayoría de los usos de bajo nivel, pero no si está preocupado por la seguridad o desea 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 usar para establecer la 'semilla' del generador de números aleatorios en un valor desconocido. Debido a que solo establece la semilla y no genera los números aleatorios, la entropía solo necesita usarse una vez, por lo que puede ser bastante 'pesada' en lo que respecta a los ciclos de reloj. Puede ejecutarse una vez al inicio del sistema y, a partir de ese momento, no debería volver a ejecutarse nunca más.

La mayor parte de la entropía se recopila (¿cosecha?) de interrupciones y otras fuentes externas. Mi primera idea que me viene a la mente sería dejar una entrada flotante (¿quizás una analógica?) con tal vez un poco de pista vinculada a ella para que actúe como una antena. Esto debería alternar aleatoriamente entre valores, que puede usar para crear un valor numérico del orden correcto para generar su generador de números pseudoaleatorios.

Otra idea podría ser tener algún tipo de transductor conectado a esa entrada para que pueda recolectar 'ruido' de manera confiable para usarlo como fuente de entropía. Eso podría ser cualquier cosa, desde un simple micrófono y un amplificador operacional, hasta un par de amplificadores operacionales conectados para brindar una gran ganancia y, por lo tanto, una salida de ruido blanco. Hay una gran cantidad de posibles fuentes de ruido en un circuito, dependiendo de lo que tenga a su disposición en cuanto a espacio y presupuesto.

Tengo la impresión de que una buena fuente de entropía (grado de seguridad) no es tan fácil. OTOH para protocolos de red y otros usos ocasionales, sus soluciones analógicas probablemente serán lo suficientemente buenas.
sí, por seguridad definitivamente usaría un chip de generación de entropía de seguridad externo, o una CPU con entropía y SHA (por ejemplo) incorporados.
En el PIC24F256GB110 , ¿es posible tener una fuente de entropía verdaderamente aleatoria sin ningún complemento de hardware adicional?
@Ezylryb lee el tercer párrafo
@Majenko: La idea de la antena no es buena en la práctica; probablemente permanecerá mayormente alto o bajo.