2012-05-13 4 views
0

Мне нужно генерировать случайные данные (для ключей, IV и т. Д.), Но я не могу найти правильный способ сделать это.Генерация случайных ключей/данных с помощью библиотеки openssl в Windows

Вот фон - Я разрабатываю свой сервер в c/C++ на окнах с помощью visual studio и использую библиотеку openssl1.0.1c.

Я читал документацию для генерации случайных данных с использованием OpenSSL на http://www.openssl.org/docs/crypto/RAND_add.html# и наткнулся на следующее -.

"

OpenSSL убеждается, что состояние PRNG является уникальным для каждого потока В системах, которые обеспечивают/dev/urandom, устройство случайности используется для прозрачного выделения PRNG. Однако во всех других системах приложение отвечает за посев PRNG, вызывая RAND_add(), RAND_egd (3) или RAND_load_file (3).

RAN D_seed() эквивалентен RAND_add(), когда num == энтропия.

RAND_event() собирает энтропию из событий Windows, таких как движения мыши и другое взаимодействие с пользователем. Он должен вызываться с аргументами iMsg, wParam и lParam всех сообщений, отправленных в оконную процедуру. Он оценит энтропию, содержащуюся в сообщении о событии (если есть), и добавит его в PRNG. Затем программа может обрабатывать сообщения как обычно.

Функция RAND_screen() доступна для удобства программистов Windows. Он добавляет текущее содержимое экрана в PRNG. Для приложений, которые могут захватывать события Windows, сеяние PRNG путем вызова RAND_event() является значительно лучшим источником случайности. Следует отметить, что оба метода не могут использоваться на серверах, работающих без взаимодействия с пользователем. "

Теперь мой сервер не работает в автоматическом режиме, так что я предполагаю, что я не могу использовать Rand_event() и Rand_screen() методы. Как безопасно использовать метод Rand_bytes() на Windows? Я не уже есть файл с энтропией, поэтому RAND_load_file() не может быть и речи, и ссылки на странице документации для EGD, похоже, не имеют EGD, поддерживаемого в Windows. Как я могу убедиться, что генератор случайных данных openssl заселен достаточно энтропия, чтобы я мог использовать Rand_bytes() для генерации моих ключей/ivs/солей и т. д.

ответ

0

Вы должны иметь возможность просто позвонить RAND_bytes, не беспокоясь об инициализации. Я не уверен в значении этой справочной страницы , но я подозреваю, что это бит устарел. OpenSSL имеет код инициализации, специфичный для ОС для RAND_bytes. Например, v1.0.0c вызывает CryptGenRandom от RAND_poll, если он доступен.

Возможно, имеет смысл проверить возвращаемое значение RAND_bytes. Он вернет ошибку, если код инициализации не смог создать достаточную энтропию (он возвращает 1 для указания успеха).

0

Вы можете попробовать EGDW (Демон энтропии для Windows)

Смежные вопросы