2010-09-21 22 views
13

Tengo un sistema integrado. Lo que me gustaría que hiciera cuando se activa o reinicia, es generar una ID única, de modo que en reinicios diferentes se genere una ID única diferente con alta probabilidad.fuentes de "unicidad"/entropía en sistemas integrados

No tiene acceso a un reloj en tiempo real, pero sí tiene acceso a un ADC y un UART. Me pregunto si existe una forma decente de recopilar entropía de estas fuentes para generar una identificación única. Estoy vagamente familiarizado con Yarrow. ¿Hay una buena manera de usar esto?

Lamentablemente no tengo ninguna fuente de ruido de características predecibles; el ADC está conectado a una cantidad de entradas de ruido relativamente bajo, así que supongo que podría usar los bits menos significativos del ADC como entradas.

edit: por lo que vale, este es el procesador TI TMS320F28335.


actualización/aclaración: que estaba buscando un método en el software de recopilación de entropía. Encontré otra manera de resolver mi problema, así que de alguna manera, mi pregunta era un punto discutible, pero todavía estoy buscando orientación sobre soluciones de software específicas para reunir entropía de fuentes de baja entropía como bits menos significativos de el ADC y el tiempo del sistema para recibir caracteres UART.

+0

¿qué procesador? Puede haber algunas opciones específicas de chip ... – dls

+0

¿Se puede agregar hardware personalizado al puerto ADC? Si es así, puede agregar un generador de ruido de diodo Zener allí. http://electronicdesign.com/article/test-and-measurement/wide-band-analog-white-noise-generator6356.aspx – Rudi

+0

pues no, el hardware es fijo. Estás hablando de fuentes de ruido de hardware de alta calidad y no tengo ninguna. –

Respuesta

10

he utilizado:

  • el bit más bajo de una entrada del ADC flotante, pero que ha tocado en ese

  • un temporizador de muy alta resolución (~ 10 ns), y dado el bajo "n" bits cuando se sincroniza entre las pulsaciones de teclas del usuario. Si acepta que las pulsaciones de teclas del usuario (a la mayor resolución de tiempo) son efectivamente aleatorias en su tiempo, funciona bastante bien.

También podría tiempo cosas como el tiempo entre paquetes de red, etc., pero estos pueden ser mucho más determinista/predecible de lo que mucha gente cosa. El ruido eléctrico y la interacción del usuario son mejores fuentes de entropía.

Por cierto, en las "temporizaciones entre pulsaciones de teclas", tiendo a almacenar aquellas en un sistema integrado comenzando en el encendido, en un búfer circular de las últimas 8 o más, porque nunca se sabe cuándo ' los voy a necesitar. (En otras palabras: ¡no espere hasta que necesite los bits aleatorios y luego obligue al usuario a presionar los botones 3 veces!)

0

Adicional adicional a la respuesta anterior de Dan ... Si su sistema incluye algún tipo de radio, puede tomar una lectura de RSSI.

3

Depende:

  • ¿Qué grado de singularidad es lo que quieres?
  • ¿Hay algún almacenamiento no volátil?
  • ¿Qué tan pronto necesita una respuesta?

Si tiene flash/NVRAM/disco, lea su semilla aleatoria, increméntela y vuelva a escribirla. La semilla puede ser un simple contador si no requiere exclusividad entre los dispositivos/el reencendido/la batería NVRAM se está agotando.Si quieres exclusividad, una vez que hayas reunido suficiente "entropía", reescribe la semilla.

(Obviamente es posible que desee hacer algo más si usted está utilizando flash y el controlador flash no tienen nivelación de desgaste, o poner en práctica su propia nivelación de desgaste.)

Si no lo hace, luego recopile entropía de todas las fuentes que pueda, y solo genere el UUID después de tener suficiente entropía. Zvi Gutterman (2006) señala que la única fuente de entropía de OpenWRT es el acceso a la red, que se observa fácilmente.

Uso de la salida del ADC parece sensato, con algunas pautas sencillas:

  • utilizar todos los bits (o por lo menos más bits que la estimación de la entropía), pero aumentan su estimación conservadora entropía.
  • La salida ADC tiene entropía cero cuando se recorta (y posiblemente baja entopia cuando está casi recortada).

Mida la cantidad de ruido en la entrada. Sospecho que obtendrás al menos un bit por muestra. Luego, clasifique sus bits y genere un UUID de la versión 4.

1

He hecho algo similar to Dan's answer. Tenía un búfer en la memoria no volátil con la diferencia del temporizador usando un temporizador de alta resolución (20ns) entre las pulsaciones del teclado del usuario que contenían las últimas 256 pulsaciones de teclas veces. Luego calculo un CRC de 32 bits para obtener un número único cada vez que el sistema se enciende. Algunas versiones sin interacción del usuario midieron el tiempo entre el mensaje recibido en los puertos serie

Estos números únicos se usaron como identificadores de nodo en una red y nunca ha habido ningún problema con los duplicados.

Esto se aumentó más tarde con un DS2401 que proporcionaba una identificación persistente pero única, pero esto solo funcionaría para usted si puede cambiar el hardware.

2

Véase también Fortuna, descrito en Practical Cryptography por Niels Ferguson y Bruce Schneier. Aunque, tanto Yarrow como Fortuna podrían ser demasiado pesados ​​para un sistema integrado.

A diferencia de Yarrow, Fortuna no requiere que calcules la entropía de tus fuentes aleatorias.

Cuestiones relacionadas