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
“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.
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:
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 0
s y 1
s. Debe haber aproximadamente el mismo número de cada uno. A continuación, repita para secuencias de dos bits. Debe haber tantas 00
s como 01
s, 10
s y 11
s. 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.
No está utilizando un PIC24FJ256GB110, que se ve así:
Está utilizando un kit de inicio de Android:
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:
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.
toby jaffey
endolito
Ezylryb
stevenvh
drxzcl
Ezylryb
drxzcl