Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

В Windows есть CryptoAPI как часть операционной системы, которая обеспечивает RNG криптографического качества.

Кроме того, я считаю, что современные процессоры Intel имеют аппаратный RNG на чипе - однако вам придется выяснить, как добиться этого в каждой ОС. Использование 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top