Привет! Так получилось, что кастомера не устраивает то, что случайность генерации ключей сертификата полностью отдана на откуп винде (функция CryptGenKey). Он хочет, чтобы все было по-взрослому - чтобы юзера просили понажимать кнопочки и подвигать мышью, и чтобы генератор случайных чисел, используемых для генерации ключей, про-seed-ался данными, полученными от пользователя, и временем их появления. Я повтыкал Cryptography API, но так и не нашел, как можно вмешаться в алгоритм генерации случайных чисел, на основе которого генерятся ключи функцией CryptGenKey. Реально ли это сделать в рамках Cryptography API, и если да, то как?
_DEN_ CryptGenKey() имеет опорную функу advapi!SystemFunction036(), а она(из advapi!GatherRandomKeyFastUserMode()) выполняет запрос к ksecdd.sys, там GatherRandomKey() завязана на счётчик тиков ядра(KeTickCount). Посему нет смысла вводить опорные значения(seed).
Clerk Зачем тогда юзера просят помогать рандому своим инпутом? Например - при создании кошелька webmoney.
_DEN_ Не знаю. Вероятно там иные механизмы вычисления работают, к примеру CryptGenRandom() не имеет в параметрах Seed'а. Кстате GatherRandomKey() есчо и к железу привязана(cpuid).
_DEN_ Видимо да. Есть три функи ReadSeed(), WriteSeed() и AccessSeed(). Юзает ключ "\Registry\Machine\SOFTWARE\Microsoft\Cryptography\RNG", "Seed". Наверно то что нужно.
Так как "рандом" в Windows выдаёт не совсем уж рандомные числа. Смарт-карты(за все не ручаюсь) при генереции ПСЧ используют шумы от нестабильности системы в целом. Инициализируйте 2 переменные размером по 1 байту, заполните их "рандомными" значениями, примените к ним операцию математического усложнения. Выходным результатом у вас будет 2 байта. После того как Вы сгенерируете достаточный числовой массив, подвергайте его статистическому контролю.
Пишите своего криптопровайдера, предоставляющего ГСЧ или используйте нормальные библиотеки вроде OpenSSL вместо мастдаевской поделки внутри которой хрен знает что.
Или RSAREF можно использовать - там есть функция InitRandomStruct (в которой можно задать seed руками) - да и по использованию она проще чем CryptoAPI, плюс в открытом виде поставляется
Его не устраивает потому что он не знает как это работает. CryptGenRandom использует ДЕСЯТКИ параметров системы в том числе: The current process ID (GetCurrentProcessID). The current thread ID (GetCurrentThreadID). The tick count since boot time (GetTickCount). The current time (GetLocalTime). Various high-precision performance counters (QueryPerformanceCounter). An MD4 hash of the user's environment block, which includes username, computer name, and search path. [...] High-precision internal CPU counters, such as RDTSC, RDMSR, RDPMC И массу других. В том числе \SOFTWARE\Microsoft\Cryptography\RNG Изменив это параметр можно влиять на генерацию CryptGenRandom. Вводить что то еще не имеет смысла. >Зачем тогда юзера просят помогать рандому своим инпутом? Например - при создании кошелька webmoney. Это не более чем маркетинг и психология человека. Типа подрыгал мышкой САМ сгенерил значения значит надежно В крайнем случае можно вначале сгенерить CryptGenRandom а затем XOR с данными от мыши ... Или же перед вызовом CryptGenRandom поместить свои данные в выходной буфер. Эти данные так же будут использованны при генерации.