Я делаю это (не) уязвимость населения, так как я совершенно уверен, что нет непосредственной опасности, но исходный код должен быть изменен основным Dev-Team для следующей версии.
В клиенте Bitcoin Windows, энтропия обеспечивается:
1. RAND_Screen при инициализации (в util.cpp)
2. Периодические вызовы на RandAddSeedPerfmon ()
Но второй метод может представить две проблемы:
А. RandAddSeedPerfmon () вызывает RandAddSeed (), который вызывает QueryPerformanceCounter (), который получает метку времени приблизительно с 25 битами реальной энтропии (так как приложения-службы, как правило, выполняются при запуске компьютера). Но QueryPerformanceCounter () требует аргумент быть QWORD выровненный, и я не уверен, что если GCC выравнивает к границам 8 байт (я думаю, что выравнивание по 4 байта). Так что, может быть, вызов иногда не удается спокойно, и эти энтропийные биты никогда не возвращаются.
B. RandAddSeedPerfmon () вызывает RegQueryValueExA (HKEY_PERFORMANCE_DATA, "Глобальный" с фиксированным размером буфера 250000. Если возвращаемые данные больше, чем этот буфер, он терпит неудачу. Но в моем XP (и, вероятно, во многих других системах) возвращаемые данные около 280 Кб, поэтому эта функция не может спокойно.
В конце концов, единственный источник случайных может быть RAND_Screen, без энтропии пересева происходит.
Обратите внимание, что первая пара ключей создается с помощью всего двух вызовов RandAddSeedPerfmon (), так что можно было бы предположить, ключи, если RAND_Screen не будет достаточно сильным. (К счастью, в XP и выше).
Проблема, которую я вижу, что нет ничего регистрируется в файле debug.log или сообщения сообщает пользователю, что он может быть генерирующий слабые ключи. Обе неудача QueryPerformanceCounter () и RegQueryValueExA должна быть зарегистрирована, а пользователь должен быть встревожен.
К Dev-Team: пожалуйста, не удаляйте RAND_Screen (интересный разговор на http://bitcoinstats.com/irc/bitcoin-dev/logs/2012/06/04)
С наилучшими пожеланиями,
Серхио.
PS: Поздравляем Гэвин для Bitcoin Foundation!