Не-Linux Реализации boost :: random_device - PullRequest
1 голос
/ 07 января 2009

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

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

Ответы [ 4 ]

2 голосов
/ 07 января 2009

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

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

1 голос
/ 07 января 2009

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

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

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

0 голосов
/ 03 августа 2009

У 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
0 голосов
/ 07 января 2009

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

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

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

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

...