Ответ 1
Согласно комментарию, оставленному по этому вопросу Хансом Пассантом, random_device
использует advapi32:SystemFunction036
, который согласно MSDN является псевдонимом для RtlGenRandom
. Это подтверждается источником библиотеки времени исполнения, поставляемым с VС++ 2010:
random_device::operator()()
в <random>
вызывает следующую цепочку функций:
_Random_device() // in xrngdev.cpp
rand_s() // in rand_s.c
RtlGenRandom()/SystemFunction036() // in advapi32.dll
Согласно комментарию, оставленному Майклом Ховардом в одной из его статей в блоге, "Криптографически безопасное случайное число в Windows без использования CryptoAPI" , RtlGenRandom
использует следующее:
RNG генерирует, как указано в приложении 3.1 FIPS 186-2, с SHA-1 как функция G. С энтропией от:
Текущий идентификатор процесса (GetCurrentProcessID).
Текущий идентификатор потока (GetCurrentThreadID).
Тики с момента загрузки (GetTickCount).
Текущее время (GetLocalTime).
Различные высокоточные счетчики производительности (QueryPerformanceCounter).
Хэш MD4 блока пользовательской среды, который включает имя пользователя, имя компьютера и путь поиска. MD4 - алгоритм хеширования который создает 128-битный дайджест сообщений из входных данных для проверки данных Целостность.
Высокоточные внутренние счетчики CPU, такие как RDTSC, RDMSR, RDPMC
Низкоуровневая системная информация: Время простоя, Io Чтение суммы перевода, Количество передачи записи ввода-вывода, ввод-вывод Другое количество передачи, чтение ввода-вывода Количество операций, количество операций ввода/вывода, ввод/вывод Другие операции, Доступные страницы, фиксированные страницы, фиксированный лимит, приоритет на пике, страница Количество ошибок, копирование на счетчик записи, количество переходов, переход кэш-памяти Count, Demero Zero Count, Count Count страницы, Чтение числа ввода/вывода, Cache Чтение подсчета, количество входов/выходов кеша, количество записей в грязных страницах, запись в память Dirty Write I/O Count, Mapped Pages Write Count, Mapped Write I/O Count, Paged Pool Страницы, страницы с невыполненными пулами, выгружаемый пул, выделенное пространство, выгружаемый пул Свободное место, Non Paged Pool Выделенное пространство, Non Paged Pool Свободное пространство, Запись в системной странице свободной системы, страница системного кода резидента, общая система Страницы драйверов, Всего системных кодовых страниц, Нейтральные пулы Lookaside Hits, Уличные выходы с постраничным бассейном, доступные страницы для пула, резидентная система Страница кэша, Страница резидентного выгружаемого пула, Страница драйвера резидентной системы, Менеджер кэша Быстрое чтение без ожидания, диспетчер кэша Fast Read с Подождите, менеджер кэша Fast Read Resource Missed, менеджер кэша Fast Read Невозможно, Менеджер кэша Быстрый список дескрипторов памяти Чтение с помощью Нет Подождите, менеджер кэша Быстрый список дескрипторов памяти Чтение с помощью Wait, Cache менеджер Быстрый список дескрипторов памяти Прочитанный ресурс отсутствует, кеш менеджер Быстрый список дескрипторов памяти Чтение не возможно, менеджер кэша Данные карты без ожидания, диспетчер кэша Карта данных с Wait, диспетчер кэша Данные карты без ожидания, миссия, диспетчер кэша. Данные карты ждут мисс, кэш менеджер Pin-Mapped Data Count, менеджер кэша Pin-Read с No Wait, Менеджер кэширования. Считывание с помощью Wait, диспетчер кэша. Пин-чтение без ожидания. Мисс, диспетчер кэшей Pin-Read Wait Miss, диспетчер кэширования Копировать-чтение с Нет ожидания, диспетчер кэширования. Копирование-чтение с помощью функции "Ожидание", "Менеджер кэша". Копирование с No Wait Miss, диспетчер кэша Copy-Read с Wait Miss, Cache менеджер Список дескрипторов памяти Чтение без ожидания, диспетчер кэша Память Список дескрипторов Чтение с ожиданием, диспетчер кэша Список дескрипторов памяти Чтение с помощью "Нет ожидания", диспетчер кэширования. Список дескрипторов памяти. Чтение с Подождите, мисс, менеджер кэша Прочитайте вперед IOs, менеджер кэша Lazy-Write IOs, Менеджер кэша Lazy-Write Pages, Менеджер кэша Data Flushes, Cache менеджер Страницы данных, Контекстные коммутаторы, Буфер перевода первого уровня Заполняет, заполняет буфер обмена второго уровня и системные вызовы.
Информация об исключении системы, состоящая из счета выравнивания, подсчета количества исключений, количества плавающей эмуляции и байтового слова Количество эмуляции.
Информация о статусе системы, состоящая из текущей глубины, максимальной глубины, суммарного распределения, выделения пропусков, суммарного освобождения, бесплатных пропусков, Тип, тег и размер.
Информация о системном прерывании, состоящая из переключателей контекста, подсчета вызовов отсроченной процедуры, скорости вызова отсроченной процедуры, времени инкремент, счетчик обхода отложенной процедуры и асинхронный счет обхода процедуры.
Информация о системном процессе, состоящая из смещения Next Entry, количества потоков, времени создания, времени пользователя, времени ядра, имени изображения, базы Приоритет, уникальный идентификатор процесса, унаследованный от уникального идентификатора процесса, ручка Счет, идентификатор сеанса, база данных каталога, максимальный виртуальный размер, виртуальный Размер, количество ошибок страницы, размер рабочего набора пиков, размер рабочего набора, квота Использование пикового выгружаемого бассейна, использование квоты с использованием выгружаемого пула, пик квоты без выгрузки Использование пула, использование квоты без использования Paged Pool, использование файла страницы, пиковая страница использование файла, количество частных страниц, количество операций чтения, запись Count, Other Operation Count, Read Transfer Count, Write Transfer Count и другой счетчик переводов.
Здесь содержится полное объяснение (включая диаграммы) в главе 8 написания безопасного кода, второе издание.