Реализации boost :: random_device не для Linux

В настоящее время Boost реализует класс random_device только для систем Linux (возможно, * nix). Кто-нибудь знает о существующих реализациях для других ОС? В идеале эти реализации должны быть с открытым исходным кодом.

Если такового не существует, как мне реализовать недетерминированный ГСЧ для Windows, а также Mac OS X? Существуют ли вызовы API в любой среде, которая предоставляет эту функциональность? Спасибо (и извините за все вопросы)!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
752
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Зависит от того, для чего вы хотите использовать свой ГСЧ.

В общих чертах, вы загружаете начальные данные в буфер, генерируете хеш-значения буфера, добавляете счетчик в результат и еще раз его хешируете. Причина использования хеш-функции заключается в том, что хорошие хеши предназначены для получения случайных результатов из более структурированных входных данных.

Если вы захотите использовать его для криптографии, все станет намного сложнее. Вам нужно будет перепрыгнуть через больше обручей, чтобы ваш ГСЧ продолжал повторять шаблоны в разумно безопасных пределах. Я могу порекомендовать «Практическую криптографию» Брюса Шнайера (для введения в ГСЧ и пример реализации). У него также есть кое-что связанное с ГСЧ о его тысячелистник RNG.

лучше использовать криптографический ГСЧ платформы, чем реализовывать его самостоятельно

orip 07.01.2009 01:17

@orip: опять же зависит от использования. Для криптографических целей ГСЧ некоторых платформ оставляют желать лучшего.

unwesen 07.01.2009 01:20

Иногда (например, C) платформенный ГСЧ не подходит практически для всего, но создаваемые им последовательности навсегда замораживаются в стандартных документах.

Marsh Ray 04.08.2009 01:26
Ответ принят как подходящий

В MacOSX вы можете использовать / dev / random (поскольку это * nix).

В Windows вам, вероятно, понадобится функция CryptGenRandom. Я не знаю, есть ли реализация boost :: random_device, которая его использует.

По словам frankodwyer, похоже, что / dev / random можно использовать для Mac. Всем спасибо, за помощь!

Brian 07.01.2009 01:30

Если boost полагается на / dev / random, скорее всего, он работает и на MacOS (раз уж он у него есть).

В Windows есть CryptoAPI как часть ОС, который обеспечивает ГСЧ криптографического качества.

Кроме того, я считаю, что современные процессоры Intel имеют аппаратный ГСЧ на кристалле - однако вам придется выяснить, как это сделать в каждой ОС. Вероятно, лучше использовать API более высокого уровня.

edit: Вот ссылка на сайт о том, как работает Intel RNG

У OpenSSL есть достойный вариант.

#include <openssl/rand.h>
...
time_t now = time(NULL);
RAND_seed(&now, sizeof(now)); // before first number you need

int success = RAND_bytes(...);
if (!success) die_loudly();

RAND_cleanup(); // after you don't need any more numbers

У Microsoft CryptoAPI есть один на Win32. Требуется еще несколько вызовов функций. Не включая детали здесь, потому что для каждого из этих вызовов есть от 2 до 5 аргументов. Будьте осторожны, CryptoAPI, похоже, требует, чтобы у пользователя был правильно настроен полный локальный профиль (C: \ Documents and Settings \ user \ Local Settings), прежде чем он сможет выдать вам случайное число.

CryptAcquireContext // see docs
CryptGenRandom
CryptReleaseContext

Другие вопросы по теме