Подтвердить что ты не робот

Источники "уникальности" /энтропии на встроенных системах

У меня встроенная система. То, что я хотел бы сделать, когда он активирует или иным образом сбрасывает, заключается в создании уникального идентификатора, так что при разных перезапусках с высокой вероятностью генерируется другой уникальный идентификатор.

У него нет доступа к часам реального времени, но он имеет доступ к АЦП и UART. Мне интересно, есть ли достойный способ собрать энтропию из этих источников, чтобы создать уникальный идентификатор. Я смутно знаком с Yarrow. Есть ли хороший способ использовать это?

К сожалению, у меня нет источников шума предсказуемых характеристик; АЦП подключен к нескольким относительно малошумящим входам, поэтому, я полагаю, я мог бы использовать наименее значимые биты АЦП в качестве входных данных.

изменить: для чего это стоит, это процессор TI TMS320F28335.


обновление/уточнение: Я искал метод в программном обеспечении сбора энтропии. Я нашел другой способ решить мою проблему, поэтому в некотором роде мой вопрос был спорным, но я все еще ищу руководство по <сильным > специальным программным решениям для сбора энтропии из источников с низкой энтропией, значащие биты АЦП и системного времени для приема символов UART.

4b9b3361

Ответ 1

Я использовал:

  • младший бит плавающего входа АЦП, но вы коснулись этого

  • таймер с очень высоким разрешением (~ 10 нс) и взял младшие "n" биты при синхронизации между нажатиями кнопок пользователя. Если вы согласны с тем, что пользовательские нажатия клавиш (с наивысшим временным разрешением) являются случайными по времени, это работает очень хорошо.

Вы также можете использовать такие моменты, как время между сетевыми пакетами и т.д., но это может быть намного более детерминированным/предсказуемым, чем то, что много людей. Электрические шумы и взаимодействие с пользователем являются лучшими источниками энтропии.

Кстати, в материалах "таймингов между нажатиями клавиш" я стараюсь хранить их во встроенной системе, начиная с включения питания, в круговом буфере последних 8 или около того, потому что вы никогда не знаете, когда вы они будут нуждаться в них. (Иными словами: не ждите, пока вам не понадобятся случайные биты, а затем заставите пользователя нажимать кнопки 3 раза!)

Ответ 2

Это зависит:

  • Какую степень уникальности вы хотите?
  • Есть ли какое-либо энергонезависимое хранилище?
  • Как скоро вам нужен ответ?

Если у вас есть Flash/NVRAM/диск, прочитайте свое случайное семя, увеличьте его и запишите. Семя может быть простым счетчиком, если вы не требуете уникальности между устройствами/reflashing/батареей NVRAM. Если вы хотите уникальность, то, как только вы соберете энтропию "достаточно", перепишите семя.

(Очевидно, что вы можете захотеть сделать что-то еще, если используете вспышку, а ваш контроллер вспышки не имеет износостойкости или не реализует собственный уровень износа.)

Если вы этого не сделаете, то собирайте энтропию из всех источников, которые вы можете, и генерируете только UUID после того, как у вас достаточно энтропии. Zvi Gutterman (2006) отмечает, что единственным источником энтропии OpenWRT является доступ к сети, что легко заметить.

Использование выхода АЦП представляется разумным, с некоторыми простыми рекомендациями:

  • Используйте все биты (или, по крайней мере, больше бит, чем ваша оценка энтропии), но консервативно оценивайте свою энтропийную оценку.
  • Выход ADC имеет нулевую энтропию при обрезании (и, возможно, низкой энтопии, когда она почти обрезана).

Измерьте количество шума на входе. Я подозреваю, что вы получите хотя бы один бит на образец. Затем хешируйте ваши биты и сгенерируйте UUID версии 4.

Ответ 3

См. также Fortuna, описанный в Практической криптографии Нильса Фергюсона и Брюса Шнайера. Хотя, как Yarrow, так и Fortuna могут быть слишком тяжелыми для встроенной системы.

В отличие от Yarrow, Fortuna не требует, чтобы вы оценивали энтропию ваших случайных источников.

Ответ 4

Я сделал что-то похожее на ответ Дэна. У меня был буфер в энергонезависимой памяти с разницей таймера с помощью таймера высокого разрешения (20 нс) между нажатиями клавиш пользователя, содержащими последние 256 нажатий клавиш. Затем я вычисляю 32-битный CRC, чтобы получить уникальный номер каждый раз, когда система включена. Некоторые версии без взаимодействия с пользователем измеряли время между сообщением, полученным на последовательных портах

Эти уникальные числа использовались как идентификаторы node в сети, и никогда не возникало проблем с дубликатами.

Впоследствии это было расширено с помощью DS2401, который предоставил постоянный, но уникальный идентификатор, но это будет работать только для вас, если вы можете изменить аппаратное обеспечение,

Ответ 5

Незначительное дополнение к ответу Дэн выше... Если в вашей системе есть какое-то радио, вы можете прочитать RSSI.