В чём разница между псевдослучайными и истинно случайными числами и как их различить
· Го Комура · Псевдослучайные числа, Истинно случайные числа, RNG, CSPRNG, Безопасность
Разговоры о случайных числах быстро сбиваются с толку, потому что совершенно разные вещи называют одним словом «случайное». Последовательность, вычисленная чем-то вроде Math.random(), и последовательность, полученная из физических явлений вроде теплового шума или джиттера тактового генератора, выглядят достаточно «рассеянными», если судить только по внешнему виду.
Однако на практике, если оставить это различие размытым, легко ошибиться в таких решениях.
- Хочется воспроизводимости в симуляции, но результаты каждый раз плывут
- Токен для повторной выдачи пароля создаётся из легко предсказуемых случайных чисел
- Прохождение статистического теста воспринимается как доказательство «это настоящие случайные числа»
- И наоборот - услышав слово «псевдо», всё сразу считают опасным
В этой статье разбираются понятия «псевдослучайные числа», «истинно случайные числа» и способ их различения в форме, удобной для практических решений. Особый акцент делается не на внешнем виде вывода, а на конструкции генератора.
Содержание статьи основано на материалах NIST, IETF, а также официальной документации ОС и языков программирования, доступных по состоянию на апрель 2026 года.
Содержание
- Сначала вывод (одной фразой)
- Что в этой статье называется «псевдослучайным» и «истинно случайным»
- Сначала - обзор на одной странице
- 3.1. Схема взаимосвязей
- 3.2. Кратчайший словарь терминов
- Что такое псевдослучайные числа
- 4.1. Одной фразой
- 4.2. Обычный PRNG и CSPRNG нужно рассматривать отдельно
- Что такое истинно случайные числа
- 5.1. Одной фразой
- 5.2. Физические случайные числа тоже не всегда используются как есть
- В чём именно разница
- 6.1. Источник генерации
- 6.2. Воспроизводимость
- 6.3. Предсказуемость
- 6.4. Скорость и эксплуатация
- Как их различить
- 7.1. По одному лишь выводу различить в принципе невозможно
- 7.2. Сначала нужно смотреть на конструкцию генератора
- 7.3. Затем - искать явные дефекты статистическими тестами
- 7.4. Для задач безопасности смотреть глазами атакующего
- Что использовать для какой задачи
- Частые заблуждения
- Таблица решений на случай сомнений
- Итог
- Справочные материалы
1. Сначала вывод (одной фразой)
Если сформулировать довольно грубо, но полезно для практики, получится так.
- Псевдослучайные числа - это последовательность, детерминированно создаваемая из внутреннего состояния и алгоритма
- Истинно случайные числа - это последовательность, источником энтропии которой служит физическое явление вроде теплового шума или джиттера
- Однако многие безопасные API случайных чисел, используемые на практике, возвращают не сырые физические случайные числа, а
DRBG / CSPRNG, засеянный источником энтропии - Поэтому различить их только по признаку «выглядит ли случайным» нельзя. Нужно смотреть на конструкцию генератора, способ подачи seed, reseed и health test
- В симуляциях и воспроизводимых тестах воспроизводимость псевдослучайных чисел становится преимуществом
- Для задач безопасности - ключей, токенов, nonce - базовое правило: использовать безопасный API случайных чисел, предоставляемый ОС или языком
Иными словами, если сразу разделить эти три категории, промахнуться сложно.
- Речь идёт об
обычном PRNG? - Речь идёт о
криптографическом PRNG / CSPRNG / DRBG? - Речь идёт об
NRBG / TRNG с физическим источником энтропии?
2. Что в этой статье называется «псевдослучайным» и «истинно случайным»
В этом разговоре просто сказать «случайные числа» - слишком широко. Поэтому сначала зафиксируем значения.
- Псевдослучайные числа (PRNG): последовательность, генерируемая детерминированной процедурой из seed и внутреннего состояния. При одинаковых условиях получается одна и та же последовательность
- Криптографически стойкие псевдослучайные числа (CSPRNG / DRBG): разновидность псевдослучайных чисел, но с акцентом на трудность предсказания. NIST SP 800-90A определяет этот deterministic random bit generator
- Истинно случайные числа: в обиходе часто означает «настоящие» или «физические» случайные числа. В терминологии NIST ближайшее понятие -
NRBG(non-deterministic random bit generator), которое описывается как генератор, постоянно обращающийся к источнику энтропии и при нормальной работе выдающий вывод с полной энтропией
Здесь важно, что «псевдослучайное» и «опасное случайное» - не синонимы.
Например, быстрые PRNG вроде линейного конгруэнтного метода или простого xorshift и CSPRNG вроде CTR_DRBG или HMAC_DRBG - оба детерминированы, но их значение для безопасности сильно различается.
3. Сначала - обзор на одной странице
3.1. Схема взаимосвязей
Быстрее всего увидеть взаимное расположение понятий на одной схеме.
flowchart LR
NOISE["Физическое явление<br/>тепловой шум, джиттер и т. п."] --> ENT["Источник энтропии"]
ENT --> SEED["seed / reseed"]
SEED --> DRBG["DRBG / CSPRNG<br/>быстрое разворачивание случайных чисел"]
DRBG --> API["Случайные числа, возвращаемые ОС / библиотекой"]
STATE["Внутреннее состояние + формула"] --> PRNG["Обычный PRNG"]
PRNG --> OUT["Последовательность, выглядящая случайной"]
Здесь важно, что вывод «безопасного API случайных чисел», который получает приложение, немного отличается и от обычного PRNG справа, и от сырого физического шума слева.
Большинство реализаций используют источник энтропии слева для seed / reseed, а затем возвращают значения, быстро развёрнутые через DRBG / CSPRNG. NIST SP 800-90B и 800-90C - это как раз документы, систематизирующие такую конструкцию источник энтропии + детерминированный генератор.
3.2. Кратчайший словарь терминов
| Вид | Из чего создаётся | Воспроизводимость при тех же условиях | Что требуется в первую очередь | Подходит для |
|---|---|---|---|---|
| Обычный PRNG | Формула и внутреннее состояние | Да | Скорость, воспроизводимость | Симуляции, игры, тестирование |
| CSPRNG / DRBG | Криптографический алгоритм + seed | Да | Трудность предсказания | Ключи, токены, nonce, session ID |
| Истинно случайные числа / NRBG | Физический источник энтропии | Практически нет | Физическая неопределённость, энтропия | Подача seed, сертифицированные устройства, лотереи с серьёзным аудитом |
Если нужна самая короткая формулировка, вот она.
- Обычный PRNG - это «случайность, которую можно воспроизвести»
- CSPRNG - это «случайность, которую можно воспроизвести, но которая спроектирована так, чтобы её было трудно предсказать извне»
- Истинно случайные числа - это «случайность, извлекающая энтропию из физических явлений»
4. Что такое псевдослучайные числа
4.1. Одной фразой
Псевдослучайные числа - это последовательность, которая «выглядит случайной», вычисляемая с обновлением внутреннего состояния.
Если задать один и тот же seed, использовать тот же алгоритм и извлечь то же количество значений, получится одна и та же последовательность. Это выглядит как недостаток, но для симуляций, тестирования и отладки это скорее большое преимущество.
Именно благодаря воспроизводимости возможны такие сценарии, как «на этом seed возникает баг» или «хочу снова сравнить со вчерашним результатом».
4.2. Обычный PRNG и CSPRNG нужно рассматривать отдельно
Это самое частое заблуждение. Утверждение «псевдослучайное = поддельное = использовать нельзя» неверно.
NIST SP 800-90A определяет детерминированные генераторы случайных битов на основе хеш-функций и блочных шифров. То есть значительная часть ядра случайных чисел, используемых в криптографии, - это сами по себе детерминированные генераторы.
Разница не в простом «похоже ли на случайность», а в трудности предсказания с точки зрения атакующего.
- Обычный PRNG
- Быстрый
- Легко воспроизводится
- Легко предсказывается, если утекли внутреннее состояние или seed
- CSPRNG / DRBG
- Тоже детерминирован
- Но спроектирован так, чтобы при защищённом внутреннем состоянии вывод было трудно предсказать
- Для задач безопасности используется именно он
Поэтому оценка безопасности только по признаку «псевдослучайное это или нет» почти всегда приводит к ошибке. Смотреть нужно на то, «какой именно псевдослучайный генератор».
5. Что такое истинно случайные числа
5.1. Одной фразой
Истинно случайные числа извлекают энтропию из физической неопределённости: теплового шума, джиттера генератора, лавинного шума, квантовых явлений и подобного.
В обиходе их называют «настоящими» или «физическими» случайными числами. В терминологии NIST ближайшее понятие - NRBG: генератор, постоянно обращающийся к источнику энтропии и, пока он работает нормально, выдающий вывод с полной энтропией.
5.2. Физические случайные числа тоже не всегда используются как есть
Это тоже важно. То, что это «истинно случайные числа», не означает, что сырые измерения передаются приложению напрямую.
У физических источников есть несколько практических сложностей.
- Присутствует смещение
- Подвержены влиянию температуры, питания, отказов, старения
- Сырая скорость вывода иногда не очень высока
- Без проверки работоспособности сломанный источник легко не заметить
Из-за этого NIST SP 800-90B делает акцент на принципах проектирования источника энтропии, понятии min-entropy, validation test и health testing. А в реализации в целом чаще применяется конструкция источник энтропии + DRBG, описанная в NIST SP 800-90C.
В итоге «истинно случайные числа» - это не какая-то мистическая сырая субстанция, а нечто, что нужно рассматривать вместе с физическим источником, его оценкой, мониторингом и постобработкой.
6. В чём именно разница
Различие между видами случайных чисел нельзя полностью описать вопросом «выглядит ли это случайным». Как минимум удобно смотреть по этим четырём осям.
6.1. Источник генерации
- Псевдослучайные числа: алгоритм и внутреннее состояние
- Истинно случайные числа: физический источник энтропии
Это самое фундаментальное различие.
6.2. Воспроизводимость
- Псевдослучайные числа: воспроизводимы при том же seed
- Истинно случайные числа: при повторном получении в тех же условиях та же последовательность значений почти не повторяется
Воспроизводимость - сила в тестировании и может быть слабостью в лотереях.
6.3. Предсказуемость
- Обычный PRNG: если можно прочитать seed или внутреннее состояние, будущее в значительной степени известно
- CSPRNG: при защищённом внутреннем состоянии спроектирован так, чтобы предсказание было затруднено
- Истинно случайные числа: трудно предсказать, если физический источник исправен, но дефекты сенсора или ошибки проектирования - отдельная проблема
Для безопасности эта ось важнее всего. Значение имеет не то, насколько «рассеян» вывод внешне, а то, можно ли угадать следующее значение.
6.4. Скорость и эксплуатация
- Псевдослучайные числа: быстро, стабильно, легко реализовать
- Истинно случайные числа: требуют сбора энтропии и мониторинга, есть ограничения по скорости и стоимости реализации
Поэтому в продакшн-системах реалистичный выбор - не «только истинно случайные» и не «только псевдослучайные», а CSPRNG, засеянный физической энтропией.
7. Как их различить
7.1. По одному лишь выводу различить в принципе невозможно
Это самый важный ответ. Глядя только на конечную выходную последовательность, нельзя утверждать «это истинно случайные числа».
Причина проста: детерминированную программу, возвращающую в точности ту же конечную последовательность, которая только что наблюдалась, можно построить всегда. В крайнем случае достаточно встроить эту последовательность в массив или ROM и возвращать по порядку.
Поэтому утверждение «выглядит естественно - значит, настоящее» не работает. В NIST SP 800-22 тоже указано, что статистическое тестирование - лишь первый шаг и само по себе никак не доказывает валидность генератора абсолютно.
С другой стороны, хороший CSPRNG проектируется так, чтобы его было очень трудно отличить от истинной случайности по одному только выводу. Здесь «неразличимость» - это, скорее, сама цель проектирования.
7.2. Сначала нужно смотреть на конструкцию генератора
При различении важнее не внешний вид вывода, а проверка следующего.
- Какой алгоритм генерации
- Простой PRNG или DRBG / CSPRNG?
- Откуда берётся seed
- Фиксированный seed, время или PID?
- Или источник энтропии ОС?
- Происходит ли reseed
- Seed задаётся один раз при запуске и больше не меняется?
- Или подаётся повторно во время работы?
- Есть ли проверка источника энтропии
- Оценка min-entropy
- Health test
- Обнаружение отказов
- Какой API используется
- Собственная реализация?
- Стандартный API ОС / языка?
С этой точки зрения различить удаётся в значительной части случаев.
- «При фиксированном seed каждый раз получается одна и та же последовательность» → псевдослучайные числа
- «Есть физический источник энтропии, предполагаются validation / health test» → конструкция с источником истинной случайности
- «Вызывается безопасный RNG API ОС» → чаще всего гибрид
физическая энтропия + CSPRNG
7.3. Затем - искать явные дефекты статистическими тестами
Статистическое тестирование не бесполезно - напротив, оно важно. Но его роль ближе к «обнаружению дефектов», чем к «доказательству».
Обычно рассматривают такие аспекты.
- Смещение между 0 и 1
- Смещение серий (run)
- Периодичность
- Корреляция
- Приближённая энтропия
- Линейная сложность
Часто ссылаются на NIST SP 800-22, а в Японии - на минимальный набор тестов случайности CRYPTREC. Они эффективны для проверки того, «нет ли в этой последовательности странного смещения или структуры».
Однако прохождение этих тестов не означает «истинно случайные числа». Хорошо сделанный CSPRNG обычно проходит их без проблем, а физический источник случайных чисел, наоборот, может провалить тест из-за смещения сенсора или неисправности.
Позиция тестирования примерно такая.
- Прошёл: пока явных дефектов не видно
- Провалился: что-то, скорее всего, не в порядке
- «Значит, доказано, что это настоящее»: этого сказать нельзя
7.4. Для задач безопасности смотреть глазами атакующего
Для токенов повторной выдачи пароля, session ID, nonce, генерации ключей вопроса «настоящее ли это» недостаточно.
По-настоящему важно проверить, может ли атакующий предсказать следующее значение.
Например:
- seed задаётся только текущим временем;
- просто подмешивается PID или порядковый номер;
- собственная реализация без оценки качества seed;
- API семейства
randomиспользуется для задач безопасности.
Ничего из этого не предотвращается тем, что «внешне выглядит правдоподобно».
Японская IPA тоже рекомендует знать API, связанные с безопасностью, и существующие библиотеки, избегая необдуманных собственных реализаций. В Python явно указано отдавать предпочтение модулю secrets, а не random. В Java эту роль играет SecureRandom.
В итоге для безопасности важнее не «псевдослучайное это или настоящее», а «используется ли безопасный seed / энтропия и безопасный API».
8. Что использовать для какой задачи
| Задача | Подходящий вариант | Причина |
|---|---|---|
| Симуляция, метод Монте-Карло, игровая логика | Обычный PRNG | Быстро, воспроизводимо через seed |
| Воспроизведение тестов, воспроизведение багов | Обычный PRNG | Можно повторить те же входные данные |
| Ключи, токены, nonce, session ID | CSPRNG / безопасный RNG API ОС | Требуется трудность предсказания |
| Подача seed, лотереи с серьёзным аудитом и подотчётностью | Конструкция с физическим источником случайности или проверяемый механизм | Важны физическая энтропия и следы аудита |
| «Безопасная случайность» в обычной разработке приложений | Стандартный безопасный RNG ОС / языка | Сложнее ошибиться, чем при собственной реализации |
На уровне реализации безопасный выбор такой.
- Нативный Windows:
BCryptGenRandom - .NET:
System.Security.Cryptography.RandomNumberGenerator - Linux:
getrandom() - Python:
secrets - Java:
SecureRandom
Для Windows Microsoft Learn описывает, что провайдер по умолчанию за BCryptGenRandom соответствует CTR_DRBG из NIST SP800-90. getrandom() в Linux также документирован как источник случайных байтов, пригодных для cryptographic purposes. RandomNumberGenerator в .NET, secrets в Python и SecureRandom в Java - это API, спроектированные с расчётом на криптографическое применение.
9. Частые заблуждения
9.1. Если генератор прошёл статистические тесты, значит, это истинно случайные числа
Неверно. Это говорит лишь о том, что «явного смещения не видно».
9.2. Если это истинно случайные числа, они всегда безопасны
Неверно. Отказ физического источника, смещение, ошибки реализации, отсутствие health test - всё это разрушает качество.
9.3. Псевдослучайные числа всегда опасны
Неверно. CSPRNG / DRBG - напротив, ядро практических безопасных API случайных чисел.
9.4. Для задач безопасности нужно использовать только сырые физические случайные числа напрямую
Не обязательно. На практике обычным решением является сочетание физического источника энтропии и CSPRNG.
9.5. random или Math.random() тоже достаточно «рассеяны», значит, их можно использовать для токенов
Не та задача. Внешняя рассеянность и трудность предсказания для атакующего - разные вещи.
10. Таблица решений на случай сомнений
Порядок рассуждений в случае сомнений такой.
- Нужно ли воспроизводить один и тот же результат?
- Да → обычный PRNG
- Нет → далее
- Будет ли проблемой, если атакующий сможет предсказать значение?
- Да → стандартный безопасный RNG ОС / языка
- Нет → выбирать по требованиям к качеству и скорости
- Нужна ли подотчётность или аудит самого источника случайности?
- Да → рассмотреть физический источник случайности или сертифицированный сервис
- Хочется реализовать самостоятельно?
- Понятное желание, но случайные числа легко реализовать неверно - сначала стоит использовать стандартный API
При таком порядке рассуждений решение находится гораздо быстрее, чем при мучительном выборе между «псевдо» и «настоящим».
11. Итог
Если сформулировать разницу между псевдослучайными и истинно случайными числами максимально грубо, но практично, получится так.
- Псевдослучайные числа создаются вычислением
- Истинно случайные числа берут энтропию из физических явлений
- Но в реальной практике главную роль в безопасных API случайных чисел играет промежуточный вариант -
источник энтропии + CSPRNG
Иными словами, смотреть нужно не на внешний вид, а на конструкцию.
- По одному лишь выводу нельзя утверждать, что это настоящие случайные числа
- Статистические тесты помогают обнаруживать дефекты, но не служат доказательством
- В безопасности главное - «можно ли это предсказать»
- Если нужна воспроизводимость - используйте PRNG, если нужна трудность предсказания - стандартный безопасный RNG ОС / языка
При таком взгляде можно выйти из грубого противопоставления «псевдослучайные числа - это подделка?».
12. Справочные материалы
-
NIST SP 800-90A Rev. 1: Recommendation for Random Number Generation Using Deterministic Random Bit Generators Базовый документ о детерминированных генераторах случайных битов.
-
NIST SP 800-90B: Recommendation for the Entropy Sources Used for Random Bit Generation Систематизирует подход к источникам энтропии, валидации и health testing.
-
NIST SP 800-90C: Recommendation for Random Bit Generator (RBG) Constructions Систематизирует конструкцию
источник энтропии + DRBG. -
NIST SP 800-22 Rev. 1a: A Statistical Test Suite for Random and Pseudorandom Number Generators for Cryptographic Applications Объясняет позицию статистического тестирования. Важно, что тестирование - первый шаг, а не доказательство.
-
NIST Glossary: Non-deterministic Random Bit Generator (NRBG) Полезно для проверки термина NIST, ближайшего к «истинно случайному».
-
RFC 4086: Randomness Requirements for Security Систематизирует нюансы случайных чисел и источников энтропии для задач безопасности.
-
Microsoft Learn: BCryptGenRandom function Описывает безопасный RNG API Windows и
CTR_DRBGпровайдера по умолчанию. -
Linux man page: getrandom(2) API случайных чисел Linux, пригодный для
cryptographic purposes. -
Microsoft Learn: RandomNumberGenerator Class Криптографически стойкий RNG API .NET.
-
Python documentation: secrets — Generate secure random numbers for managing secrets Основы работы со случайными числами для задач безопасности в Python.
-
Oracle Java Documentation: SecureRandom Обзор безопасного RNG в Java и подхода к seed / энтропии.
-
IPA: Chapter 3, Section 3 — Using Strong Cryptography and Pseudo-Random Numbers Важность seed, тестирования и нюансы использования API (на японском языке).
Похожие статьи
Недавние статьи с теми же тегами помогут подробнее изучить близкие темы.
Политика выполнения PowerShell и подпись скриптов — практическое руководство, как перестать «затыкать дыры» параметром Bypass
Политика выполнения PowerShell — это «не граница безопасности, а защитный механизм». Разбираем различия между RemoteSigned и другими поли...
Если ваше Windows-приложение приняли за вирус — как реагировать на ложные срабатывания Microsoft Defender и жить с влиянием на производительность
Разбираем правильный порядок действий, если Microsoft Defender ложно определяет ваше Windows-приложение как вредоносное: как устроена сов...
Встраиваем аутентификацию Entra ID в приложения WinForms/WPF — практическая архитектура на MSAL.NET и брокере WAM
Разбираем порядок встраивания аутентификации Entra ID в десктопные приложения WinForms/WPF: концепцию публичного клиента, регистрацию при...
Что сделать перед утилизацией Windows PC — практический чек-лист по стиранию данных, отвязке учётных записей и резервному копированию
Разбираем, что нужно сделать перед утилизацией, передачей, продажей или возвратом по лизингу Windows PC: резервное копирование, стирание ...
Как правильно работать с токенами олицетворения в Windows — заимствование прав на уровне потока и безопасный откат
Разбираем токены олицетворения в Windows — токены доступа, первичные и потоковые токены, уровни олицетворения, RevertToSelf и WindowsIden...
Связанные темы
Эти страницы показывают тему статьи в более широком контексте услуг и решений.
Технические темы Windows
Раздел о разработке Windows, расследовании сбоев и использовании существующих активов.
Услуги по этой теме
Статья напрямую связана со следующими услугами.
Технические консультации и ревью дизайна
Если нужно разграничить воспроизводимость для симуляций и непредсказуемость для безопасности, начиная с выбора API генерации случайных чисел и проектирования seed, эта тема хорошо подходит для технической консультации и ревью архитектуры.
Частые вопросы
Вопросы, которые часто возникают при консультациях по теме статьи.
- В чём разница между псевдослучайными числами и истинно случайными (настоящими) числами?
- Псевдослучайные числа (PRNG) - это последовательность, детерминированно создаваемая алгоритмом из seed и внутреннего состояния: при одинаковых условиях получается одна и та же последовательность. Истинно случайные числа - это последовательность, источником энтропии которой служит физическое явление вроде теплового шума или джиттера генератора, и при повторном получении в тех же условиях та же последовательность значений почти не повторяется. Однако многие безопасные API случайных чисел, используемые на практике, возвращают не сырые физические случайные числа, а гибридную конструкцию - CSPRNG / DRBG, засеянный физическим источником энтропии.
- Можно ли по одному только выводу отличить псевдослучайные числа от истинно случайных?
- Определить по конечной выходной последовательности, что это именно истинно случайные числа, невозможно. Причина проста: детерминированную программу, возвращающую в точности ту же последовательность, что и наблюдаемая, можно построить всегда. При различении важнее не внешний вид вывода, а конструкция генератора: какой используется алгоритм генерации, откуда берётся seed, происходит ли reseed, есть ли проверка источника энтропии (оценка min-entropy, health test) и какой именно API используется.
- Если генератор проходит статистические тесты, можно ли считать его истинно случайным?
- Нет, нельзя. Роль статистических тестов ближе к обнаружению дефектов, чем к доказательству. В NIST SP 800-22 тоже указано, что статистическое тестирование - лишь первый шаг и само по себе никак не доказывает валидность генератора абсолютно. Хорошо сделанный CSPRNG обычно проходит такие тесты без проблем, а физический источник случайных чисел, наоборот, может провалить их из-за смещения сенсора или неисправности. Позиция такая: прохождение теста означает, что явных дефектов пока не видно, а провал - что что-то, скорее всего, не в порядке.
- Какой API случайных чисел использовать для задач безопасности?
- Для ключей, токенов, nonce и session ID базовое правило - использовать безопасный API случайных чисел, предоставляемый ОС или языком. Конкретно: для нативного Windows - BCryptGenRandom, для .NET - System.Security.Cryptography.RandomNumberGenerator, для Linux - getrandom(), для Python - модуль secrets, для Java - SecureRandom. Следует избегать собственных реализаций с seed на основе текущего времени или PID, а также использования API семейства random для задач безопасности.
Об авторе
Страница с профилем автора статьи.
Го Комура
Представитель KomuraSoft LLC
Специализируется на разработке программного обеспечения для Windows, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.
Публичные ссылки