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

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

Я использую 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

Я корпел над этим около недели, но безрезультатно. Почти сдался!! Есть желающие помочь?


person Timmay    schedule 13.01.2014    source источник
comment
Я уверен, что это глупый вопрос, но проверяли ли вы, что в процессоре нет встроенного аппаратного генератора случайных чисел? Многие ARM9 это делают, некоторые нет. Можете ли вы рассказать нам больше о процессоре на этой штуке? Я не вижу очевидного описания для него.   -  person Tom    schedule 13.01.2014
comment
@ Том Нет, это совсем не глупо! Я бы хотел, чтобы в него был встроен аппаратный генератор случайных чисел. Однако во всей документации, которую я имею от поставщика, ничего не говорится о случайности. Я могу связаться с ними напрямую, но это крайне маловероятно!   -  person Timmay    schedule 14.01.2014


Ответы (1)


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

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

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

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

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

Затем ответ безопасности:

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

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

person Paul    schedule 13.01.2014
comment
Большое спасибо за хорошо продуманный ответ. Кажется, мне придется установить порог на ноль, чтобы добавить другие источники энтропии. Да, заряд батареи не является хорошим источником энтропии, но это POS-терминал, а источников не так много. Единственное, что у меня пока есть, что приближается к хорошей энтропии, это ввод с клавиатуры. Я думаю, что мне придется использовать файл семени. Большое спасибо за совет! - person Timmay; 14.01.2014
comment
Вы могли бы подумать, что POS-терминал, который в основном предназначен для выполнения безопасных транзакций, будет оснащен криптографически сильной случайностью... - person Tom; 14.01.2014
comment
@ Том Я бы тоже на это надеялся, но мой опыт показывает, что часто это не так :( - person Paul; 14.01.2014
comment
@Tinmay: Вы должны устанавливать пороговое значение равным нулю только для источников, которые не могут каждый раз выдавать энтропию. Ваш источник батареи всегда может предоставить 4 байта (при условии, что int на 32-битной платформе).. - person Paul; 14.01.2014
comment
@Tom: Увы, в этом нет никакой случайности! - person Timmay; 16.01.2014
comment
@Paul Пожалуйста, обновите статью об источниках энтропии: 0 Итак, вот что я собираюсь сделать для моей предыдущей проблемы. - Создайте начальный файл на другой ОС. - Оказавшись на терминале, я прочитаю этот файл, используя ctr_drbg_update_seed_file Это работает?? - person Timmay; 16.01.2014
comment
@Timmay Да, это сработает. По крайней мере, если вы гарантируете, что сборщик энтропии все еще может предоставить 48 байтов случайных чисел для запуска CTR-DRBG. - person Paul; 16.01.2014
comment
Ослабляет ли добавление очень предсказуемого источника энтропии к ГСЧ энтропию, делает ли его совершенно бесполезным в качестве источника случайности, ломает ли он его мгновенно или ничего не делает? - person Quip Yowert; 10.05.2015
comment
Это ничего не делает с этим. Он не увеличивает энтропию, если она предсказуема, но и не может ее уменьшить. - person Paul; 12.05.2015