Fuente de la entropía en Microchip PIC24F

7

Estoy trabajando para desarrollar un hardware accesorio para Android. Actualmente, estoy intentando 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 un número aleatorio diferente al uso de una forma de entropía, ¡me gustaría mucho escucharlo de ti!

El software que estoy usando:

MPLAB IDE Versión 8.73 MPLAB C Compiler para PCI24 v3.30

El dispositivo / herramientas que estoy usando:

DM240415 - PIC24F Accessory Development Starter Kit para Android p>     

pregunta Ezylryb

3 respuestas

12
  

"Cualquiera que considere métodos aritméticos para producir dígitos al azar 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 simple esquema a continuación muestra cómo obtener ruido blanco de un zener mediante la conexión en cascada de dos LNA (amplificadores de bajo nivel de ruido) para aumentar el nivel de ruido.

Sinoleimportaqueelruidoseablanco,simplementepuedeusarunamplificadoropampconunagranamplificación,conuncomparadorsiguiéndolo.Laamplificacióndelopampponeunlímitealanchodebanday,porlotanto,alatasadecambioensuseñaldigital.Siesnecesario,conecteencascadadosoperacionescomolosLNAenelesquemaparaobtenerunflujodebitsaleatoriomásrápido.

PuedeusarelmóduloSPIpararegistrarenbytesdebitsaleatoriosdeestecircuito.
(ElSPIessolounaformasencilladerecopilarautomáticamente8bitsaleatorios,noagreganingúnniveldedeterminismo:laentradacambiadeformacontinuayaleatoriaynuncasesabecuálserálapróximavezquellegueelreloj.TambiénpuedeleerunpindeE/Sycambiarelniveldeesebitasubytederesultados.)

Este circuito es una posible solución alternativa, que también depende de un diodo Zener como ruido. fuente:

Elesquemamencionael 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 generalmente son 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 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, es decir, 0 s y 1 s. Debe haber aproximadamente el mismo número de cada uno. A continuación repetir para secuencias de dos bits. Debe haber tantos 00 s como 01 s, 10 s y 11 s. Repita para secuencias de tres bits, etc. No soy un estadístico, por lo que puede haber pruebas mejores / más fáciles. Siéntete libre de agregarlos.

    
respondido por el stevenvh
4

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

EstásutilizandounkitdeiniciodeAndroid:

que, como entiendes, es un PCB bastante fijo: no estás diseñando el PCB, y un vistazo rápido a schematic no reveló mucho de lo que se creó o podría ser reutilizado como fuente de entropía de hardware, excepto algunas trazas de ADC que podrían funcionar como antenas sugerido por Matt .

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

  1. Puede medir los tiempos precisos de las comunicaciones asíncronas o de la comunicación en Android, y utilizar los bits inferiores 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, y por lo tanto no es adecuado para aplicaciones de seguridad.
  2. Use los bits más bajos de las lecturas de ADC para generar un ruido aleatorio. Tiene varios rastros flotantes, por lo que esto debería obtener resultados impredecibles.
  3. ¡Tienes encabezados de ruptura para un escudo Arduino! Esto significa que puede agregar 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, tenga en cuenta que la seguridad criptográfica y la verdadera aleatoriedad son 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 un problema grave.

    
respondido por el Kevin Vermeer
3

El problema con los generadores de números pseudoaleatorios es que no lo son. Generan una secuencia de números desde 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 si 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 debe 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, nunca más deberá ejecutarse nuevamente.

La mayor parte de la entropía se recopila (¿se cosecha?) a partir 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 de forma bastante aleatoria entre los valores, que puede utilizar 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 recopilar de forma confiable el "ruido" que se utilizará 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 obtener una gran ganancia y, por lo tanto, una salida de ruido blanco. Existe una gran cantidad de posibles fuentes de ruido en un circuito, dependiendo de lo que tenga a su disposición en cuanto a los bienes raíces y el presupuesto.

    
respondido por el Majenko

Lea otras preguntas en las etiquetas