Криптографически безопасные PRNG в C

Я работаю над созданием очень больших случайных целых чисел в C. Я обнаружил, что /dev/random — хороший источник, но он блокируется, если пул энтропии исчерпан. /dev/urandom выглядел следующим образом, но качество случайности не так хорошо по сравнению с ним. Есть ли способ использовать целое число из /dev/random для заполнения PRNG, чтобы мне не приходилось продолжать чтение из /dev/random? Я ищу криптографически безопасный PRNG, хотя и не в долгосрочной перспективе.


person JessMcintosh    schedule 14.03.2013    source источник
comment
/dev/urandom предполагается криптографически безопасным и, по сути, совпадает с тем, что вы предлагаете - использует /dev/random для заполнения PRNG. Как вы проверяли качество?   -  person Neil Slater    schedule 14.03.2013


Ответы (4)


Использование целых чисел из /dev/random для заполнения PRNG — это именно то, что делает /dev/urandom. Если у вас нет доказательств конкретной слабости в urandom, вы заново изобретаете колесо.

Хотя это правда, что urandom слабее, чем /dev/random, предложенная вами схема слаба точно так же, поэтому она не дает никаких преимуществ по сравнению с простым использованием urandom. urandom имеет дополнительное преимущество, заключающееся в том, что он может постоянно подмешивать новую энтропию к генерируемым числам по мере того, как новая энтропия становится доступной из базового оборудования. FreeBSD, например, только имеет устройство в стиле urandom.

Наконец, urandom существует уже много лет, и его источник был проверен экспертами по безопасности, чего нельзя сказать о замене, которое можно создать самостоятельно.

person user4815162342    schedule 14.03.2013
comment
Спасибо, тогда я воспользуюсь urandom. - person JessMcintosh; 15.03.2013

Вероятно, это будет зависеть от платформы. Некоторые уже используют криптозащищенные PRNG для /dev/random. Примеры: FreeBSD, OpenBSD, OS X. Вы также можете посмотреть на Yarrow, Fortuna, ISAAC (на основе RC4). Это хорошее место для начала, если вы хотите узнать больше: http://csrc.nist.gov/groups/ST/toolkit/index.html

person Randy Howard    schedule 14.03.2013

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

Тогда возникает вопрос, сколько энтропии вы хотите получить и как быстро? Потому что «большие числа» могут означать что угодно, от просто гигабайта случайных битов для проекта до «мне нужен постоянный поток энтропии 100 КБ/с для этой службы».

person Neil Slater    schedule 14.03.2013

Было бы еще лучше, если бы у вас было оборудование для этого. Проверьте ваш ЦП или любой другой модуль, поддерживает ли он криптографическую генерацию случайных чисел. И /dev/random, и /dev/urandom не защищены с точки зрения криптографии. Вы не должны использовать их в качестве источника в своем приложении.

person Chiara Hsieh    schedule 15.03.2013