Правильно добавить источник энтропии в генератор случайных чисел

Мне поручено создание генератора случайных чисел для встроенной системы. На данный момент источники энтропии, которые я использую, - это ввод с клавиатуры и другие переменные, такие как уровень сигнала и уровень заряда батареи.

Я использую PolarSSL, который имеет удивительную портативную библиотеку SSL для встроенных систем. Однако, за исключением документации, в интернете об этом очень мало!

Я думаю, что неправильно добавляю источники энтропии в мой накопитель энтропии. Это вызывает проблемы с модулем CTR-DRBG, который возвращает ошибку при инициализации. ( Ошибка источника -52) Так как ГСЧ предназначено для встроенной системы, исходная энтропия в системе отсутствует, следовательно, ошибка. ( ССЫЛКА) Я не получаю ошибок, когда пробую тот же ГСЧ в других стандартных ОС, таких как Windows. Вот часть кода, относящегося к нему.

    // Global Variables.
ctr_drbg_context ctx;
entropy_context etx;

// Inside Main
entropy_init( &etx );
// Add entropy sources

// Initializing CTR_DRBG
printf("Before ctrdrbg: %d", err);
err = ctr_drbg_init( &ctx, entropy_func, &etx,  (const unsigned char *) "RANDOM_GEN", 10 );
if( err != 0 )
{
   printf("Failed in ctr_drbg init!: %d", err);
} 

Выход: Error on Ctr_drbg init: -52

Я размышлял об этом в течение недели без прогресса. Почти сдаюсь! Кто-нибудь готов помочь?

1 ответ

Решение

Сначала фактический ответ:

Основная причина, по которой он работает в Windows, заключается в том, что он может использовать несколько источников энтропии, специфичных для ОС, которые генерируют "достаточно" случайное число.

Количество энтропии, запрошенное CTR-DRBG, составляет 48 байтов (на основе конфигурации по умолчанию).

Для того чтобы пул энтропии мог обеспечить эти 48 байтов, он будет делать максимум 256 опросов (ENTROPY_MAX_LOOP) к каждому источнику энтропии и поместите все это в накопитель. Ожидается, что все источники предоставят свои пороговые значения как минимум! Если этого не произойдет, поскольку он не возвращает больше данных о последовательных вызовах, он потерпит неудачу, как это происходит сейчас (POLARSSL_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED).

Таким образом, вам нужно будет предоставить "лучшие" источники энтропии или определить порог для более подходящего значения для конкретного источника (для некоторых источников это может быть 0, если нельзя ожидать, что источник всегда будет предоставлять данные энтропии).

Тогда ответ безопасности:

Вам нужна настоящая энтропия, чтобы пул энтропии был полезен. Индикатор батареи не является действительно безопасным (так как он довольно предсказуем (всегда 100 при включении) и часто в предсказуемом диапазоне. Использование ввода с клавиатуры может быть полезным, если все сделано правильно. Но вам понадобится больше... Лучший способ "запустить" систему, которая не предоставляет аппаратную ГСЧ в своем наборе микросхем, - это использовать начальный файл, сгенерированный в более защищенной системе, прочитать его и обновить при запуске и завершении работы. Этот начальный файл можно использовать как энтропию source Я передаю его непосредственно в ctr_drbg. В вашем случае я бы ожидал, что у вас будут только очень низкие пороговые источники (иногда 0) и вы получите основную энтропию из начального файла.

Изменить: я буду улучшать нашу статью базы знаний о добавлении источников энтропии, чтобы лучше охватить эту ситуацию!

Другие вопросы по тегам