Я работаю над созданием очень больших случайных целых чисел в C. Я обнаружил, что /dev/random — хороший источник, но он блокируется, если пул энтропии исчерпан. /dev/urandom выглядел следующим образом, но качество случайности не так хорошо по сравнению с ним. Есть ли способ использовать целое число из /dev/random для заполнения PRNG, чтобы мне не приходилось продолжать чтение из /dev/random? Я ищу криптографически безопасный PRNG, хотя и не в долгосрочной перспективе.
Криптографически безопасные PRNG в C
Ответы (4)
Использование целых чисел из /dev/random
для заполнения PRNG — это именно то, что делает /dev/urandom
. Если у вас нет доказательств конкретной слабости в urandom, вы заново изобретаете колесо.
Хотя это правда, что urandom слабее, чем /dev/random
, предложенная вами схема слаба точно так же, поэтому она не дает никаких преимуществ по сравнению с простым использованием urandom. urandom имеет дополнительное преимущество, заключающееся в том, что он может постоянно подмешивать новую энтропию к генерируемым числам по мере того, как новая энтропия становится доступной из базового оборудования. FreeBSD, например, только имеет устройство в стиле urandom.
Наконец, urandom существует уже много лет, и его источник был проверен экспертами по безопасности, чего нельзя сказать о замене, которое можно создать самостоятельно.
Вероятно, это будет зависеть от платформы. Некоторые уже используют криптозащищенные PRNG для /dev/random. Примеры: FreeBSD, OpenBSD, OS X. Вы также можете посмотреть на Yarrow, Fortuna, ISAAC (на основе RC4). Это хорошее место для начала, если вы хотите узнать больше: http://csrc.nist.gov/groups/ST/toolkit/index.html
Если вам просто нужен большой пул энтропии, вы можете сделать что-то простое, например, взять SHA1 блоков данных из шумного потока данных (например, видео или аудио загруженной среды).
Тогда возникает вопрос, сколько энтропии вы хотите получить и как быстро? Потому что «большие числа» могут означать что угодно, от просто гигабайта случайных битов для проекта до «мне нужен постоянный поток энтропии 100 КБ/с для этой службы».
Было бы еще лучше, если бы у вас было оборудование для этого. Проверьте ваш ЦП или любой другой модуль, поддерживает ли он криптографическую генерацию случайных чисел. И /dev/random, и /dev/urandom не защищены с точки зрения криптографии. Вы не должны использовать их в качестве источника в своем приложении.