Криптографически стойкие PRNG
Изучите /dev/urandom, ChaCha20-CSPRNG и Fortuna
«Криптографически стойкие PRNG» — бесплатный урок Cryptology Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cryptology Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cryptology Academy содержит 4 уроков всего.
Итоги требований к CSPRNG
CSPRNG должен обеспечивать: (1) непредсказуемость следующего бита — даже при знании всех предыдущих битов следующий бит нельзя предсказать с вероятностью > 1/2 + пренебрежимо малой величины; (2) устойчивость к расширению после компрометации состояния — получение текущего состояния ничего не раскрывает о прошлом результате.
/dev/urandom и getrandom()
Linux /dev/urandom использует CSPRNG, инициализированный из пула энтропии. После первоначальной инициализации (128 бит энтропии) его безопасно использовать, даже когда пул «пуст» — CSPRNG поддерживает собственное внутреннее состояние. getrandom() — современный эквивалент системного вызова.
CSPRNG на основе ChaCha20
Ядро Linux версии 5.17 и новее заменило свой CSPRNG схемой на основе ChaCha20. ChaCha20 работает быстро (аппаратное ускорение не требуется), обеспечивает 256-битную стойкость и имеет хорошо изученное доказательство безопасности. Одноразовым числом служит счётчик, а ключ поступает из пула энтропии.
Fortuna
Fortuna (Ferguson и Schneier, 2003) — схема CSPRNG, которая поддерживает 32 пула энтропии и непрерывно накапливает энтропию. Генератор повторно инициализируется на основе пулов по мере их заполнения. Схема устойчива к атакам со сбросом RNG и атакам при частичной компрометации состояния.
Скрытая уязвимость DUAL_EC_DRBG
NIST SP 800-90A изначально включал DUAL_EC_DRBG, основанный на эллиптических кривых. Документы Сноудена раскрыли, что NSA внедрила скрытую уязвимость: точки EC были выбраны так, чтобы NSA могла предсказывать вывод из любого начального значения. Никогда не используйте DUAL_EC_DRBG. NIST удалил его в 2014 году.
CTR_DRBG
CTR_DRBG (NIST SP 800-90A) использует AES в режиме счётчика как CSPRNG. Начальное значение = 256-битный ключ + 128-битное одноразовое число. Каждый вызов увеличивает счётчик. Широко реализован в OpenSSL, BoringSSL и Windows BCrypt. Аппаратно ускоряется на процессорах с AES-NI.
HASH_DRBG и HMAC_DRBG
HASH_DRBG итеративно использует хеш-функцию (SHA-256) вместе с начальным значением. HMAC_DRBG использует HMAC для смешивания. HMAC_DRBG проще правильно реализовать, поэтому он применяется во многих встраиваемых системах (mbedTLS, WolfSSL).
Повторная инициализация и добавление энтропии
Даже CSPRNG необходимо периодически повторно инициализировать. Интервал повторной инициализации CTR_DRBG составляет 2^48 запросов. Fortuna повторно инициализируется из своих пулов энтропии. Ручная повторная инициализация: добавляйте свежую энтропию (байты, полученные с помощью getrandom()) в состояние CSPRNG при запуске и после fork().
Проблема разветвления процесса
При создании копии процесса с помощью fork() родительский и дочерний процессы наследуют одно и то же состояние CSPRNG — они будут выдавать одинаковый вывод. Исправление: вызовите getrandom() для немедленной повторной инициализации после fork(). В последних версиях OpenSSL это обрабатывается автоматически через pthread_atfork().
CSPRNG на практике: Python
import secrets key = secrets.token_bytes(32) # 256-bit key nonce = secrets.token_bytes(12) # 96-bit nonce for AES-GCM pin = secrets.randbelow(10**6) # 6-digit PIN # Never use random module for cryptography
Криптография в браузере
window.crypto.getRandomValues(typedArray) — это CSPRNG браузера. Он вызывает источник энтропии OS. Используется API WebCrypto для генерации ключей. Никогда не используйте Math.random() для защиты — это некриптографический PRNG, инициализируемый системным временем.
Быстрая проверка
Какой модуль Python следует использовать для генерации криптографически стойких случайных байтов?
Повторение
CSPRNG, такие как ChaCha20, CTR_DRBG и Fortuna, генерируют непредсказуемый вывод из начальных значений энтропии. Избегайте DUAL_EC_DRBG, random.random() и Math.random(). Используйте secrets в Python или window.crypto в браузере. Далее: реальные сбои, связанные с энтропией.
Часто задаваемые вопросы
Урок «Криптографически стойкие PRNG» бесплатный?
Да — полный текст урока «Криптографически стойкие PRNG» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cryptology Academy, подпишись на CoddyKit PRO. Курс Cryptology Academy содержит 4 уроков всего.
Чему я научусь в уроке «Криптографически стойкие PRNG»?
Изучите /dev/urandom, ChaCha20-CSPRNG и Fortuna Ты практикуешь Cryptology Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Cryptology Academy?
Предыдущий опыт не требуется. Cryptology Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Криптографически стойкие PRNG»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Cryptology Academy?
Да. Каждый урок Cryptology Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Истинная случайность и псевдослучайность
- Криптографически стойкие PRNG
- Истощение энтропии и ошибки из-за слабых ключей
- Безопасная генерация ключей, одноразовых чисел и векторов инициализации