Перейти к содержанию

Аппаратный генератор случайных чисел (TRNG)

Функция rand() выдаёт одну и ту же последовательность после каждого включения: это алгоритм, а не случай. Для ключей шифрования, идентификаторов сеансов и случайных задержек в сетевых протоколах нужен источник физического шума — аппаратный генератор случайных чисел, который есть во многих микроконтроллерах.

Обновлено Редакция GAW

Аппаратный генератор случайных чисел (TRNG, true random number generator) — блок микроконтроллера, который получает случайные числа из физического шума, а не по алгоритму. В отличие от функции rand(), его последовательность нельзя повторить, зная начальное состояние. Такие числа нужны для криптографических ключей, одноразовых значений в протоколах, случайных задержек при доступе к общей среде.

STM32: блок RNG

ПараметрSTM32F4
Источник шуманесколько кольцевых генераторов, выходы по XOR
Выход32-битное число в RNG_DR
Интервал40 тактов RNG_CLK между числами
Проверкиошибка зерна SEIS, ошибка такта CEIS
Проверка производителемтесты FIPS PUB 140-2 с долей успеха 99 %

Источник: RM0090, разд. 24. Аналоговая часть питает «зернами» регистр сдвига с линейной обратной связью, а он тактируется отдельным сигналом RNG_CLK, поэтому качество чисел не зависит от частоты шины. Блок следит за собой: ошибка зерна возникает, если пришло больше 64 одинаковых бит подряд или больше 32 чередований 0 и 1, ошибка такта — если RNG_CLK ниже HCLK/16. RNG_CLK у STM32F4 берётся с того же выхода PLL, что и такт USB, — см. дерево тактирования.

Правило FIPS 140-2, которое повторяет RM0090: первое число после включения не используют, а каждое следующее сравнивают с предыдущим — совпадение означает отказ.

ESP32: регистр RNG_DATA_REG

В ESP32 случайные числа получаются из теплового шума и рассогласования асинхронных тактов. Источник шума — высокоскоростной АЦП радиочасти или SAR АЦП (ESP32 TRM, гл. 18). Отсюда два правила:

  • Источник должен работать. Без Wi-Fi, Bluetooth или включённого SAR АЦП регистр выдаёт псевдослучайные числа. Об этом же предупреждает статья об АЦП ESP32.
  • Не читать слишком часто. Не чаще 5 МГц при шуме высокоскоростного АЦП и 500 кГц при шуме SAR АЦП — иначе энтропии на число не хватит.

Где нужен

Аппаратные генераторы применяют в защищённых загрузчиках и при шифровании флеш-памяти, для сеансовых ключей TLS, случайных идентификаторов и задержек повтора в сетевых протоколах. Для статистического моделирования и игр хватает и программного генератора, засеянного одним аппаратным числом.

Частые вопросы

Когда ESP32 выдаёт не истинно случайные, а псевдослучайные числа?

Когда не работает ни один источник шума. По техническому руководству ESP32 (Version 5.8, разд. 18.4) истинно случайные числа получаются, только когда включён высокоскоростной АЦП — он работает вместе с Wi-Fi или Bluetooth — или SAR АЦП; иначе RNG_DATA_REG отдаёт псевдослучайные числа. Руководство не уточняет, насколько они предсказуемы, поэтому для ключей шумовой источник включают заранее.

Можно ли читать RNG STM32 подряд без проверки флагов?

Нет. Число готово только при DRDY = 1, а при ошибке зерна (SEIS) значение в RNG_DR использовать нельзя: в нём может не хватать энтропии (RM0090, разд. 24.4.2). После SEIS очищают флаг и перезапускают генератор битом RNGEN. Новое число появляется через 40 тактов RNG_CLK.

От чего тактируется RNG в STM32F4?

От отдельного такта RNG_CLK — у STM32F4 это выход главной PLL с делителем PLLQ, общий с USB OTG FS и SDIO (RM0090, разд. 7.3.2). Если он окажется ниже HCLK/16, генератор выставит ошибку такта CEIS и перестанет выдавать числа (RM0090, разд. 24.4.2). Делитель PLLQ удобно подобрать калькулятором тактирования STM32.

Источники

  1. STMicroelectronics. RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437, STM32F429/439, Rev 21 — разд. 24: RNG выдаёт 32-битные случайные числа на основе непрерывного аналогового шума, прошёл тесты FIPS PUB 140-2 с долей успеха 99 %; между двумя числами 40 периодов RNG_CLK; аналоговая часть — несколько кольцевых генераторов, выходы которых складываются по XOR и питают регистр сдвига с линейной обратной связью; RNG_CLK отдельный, качество чисел не зависит от HCLK; разд. 24.3: по FIPS 140-2 первое число после включения RNGEN не используют, а каждое следующее сравнивают с предыдущим; разд. 24.4.2: SEIS — ошибка зерна (больше 64 одинаковых бит подряд или больше 32 чередований 0 и 1), число в RNG_DR при этом не использовать; CEIS — ошибка такта, fRNG_CLK < fHCLK/16; регистры доступны только словами; разд. 7.3.2: f(USB OTG FS, SDIO, RNG) = f(VCO) / PLLQ
  2. Espressif. ESP32 Technical Reference Manual, Version 5.8 — гл. 18: каждое 32-битное значение RNG_DATA_REG (0x3FF75144) — истинно случайное число из теплового шума и рассогласования асинхронных тактов; источник шума — высокоскоростной АЦП (включается вместе с Wi-Fi или Bluetooth) или SAR АЦП; читать не чаще 5 МГц при шуме высокоскоростного АЦП и 500 кГц при шуме SAR АЦП; если не включён ни один из АЦП, возвращаются псевдослучайные числа; выборка 2 ГБ прошла тесты Dieharder 3.31.1

Нашли ошибку?