Я хочу создать случайный криптографический ключ в Windows.Где я могу получить энтропию?
Я бы хотел, чтобы моя функция энтропии работала без сетевого подключения и была надежной в Windows 2000 и выше.Даже источники, которые могут или не могут обеспечить небольшое количество энтропии, могут быть полезны, поскольку все источники будут объединены.
Это мой первоначальный список функций:
GetCurrentProcessID , GetCurrentThreadID , GetTickCount , GetLocalTime , QueryPerformanceCounter , GlobalMemoryStatus , GetDiskFreeSpace GetComputerName , GetUserName , GetCursorPos , GetMessageTime , GetSystemInfo , CryptGenRandom , GetProcessHandleCount , GetProcessMemoryInfo .
Хотя ранние версии функции CryptGenRandom могут содержать недостатки более поздние версии следуют безопасным стандартам (см. Замечания на странице CrypGenRandom.)
Это слабо для , просто используйте время как ваше семя . Существует ответ под Какое самое безопасное начальное число для генерации случайного числа? , которое объясняет, что непредсказуемому случайному начальному числу может потребоваться только 128 битов для создания безопасного PRNG. Поэтому, вероятно, нет необходимости находить больше источников, чем указано в вопросе, и обычно функция CryptGenRandom уже содержит и генерирует достаточно энтропии для себя, что вызывающей стороне не нужно ничего делать из этого.
CryptGenRandom и функция CryptAcquireContext , которая должна предшествовать ей, может быть вызвана из Delphi следующим образом.
Единственный внешний источник, который есть у большинства машин - это Mic In / Line In, вызывайте waveInOpen + waveInPrepareHeader + waveInAddBuffer + waveInStart. Насколько это случайно, вероятно, зависит от аппаратного обеспечения ...
Если это опция, вы можете попросить пользователя переместить указатель мыши на некоторое время.