Cryptography API: кастомная генерация ключей

Тема в разделе "WASM.WIN32", создана пользователем _DEN_, 10 авг 2010.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Привет!

    Так получилось, что кастомера не устраивает то, что случайность генерации ключей сертификата полностью отдана на откуп винде (функция CryptGenKey). Он хочет, чтобы все было по-взрослому - чтобы юзера просили понажимать кнопочки и подвигать мышью, и чтобы генератор случайных чисел, используемых для генерации ключей, про-seed-ался данными, полученными от пользователя, и временем их появления. Я повтыкал Cryptography API, но так и не нашел, как можно вмешаться в алгоритм генерации случайных чисел, на основе которого генерятся ключи функцией CryptGenKey. Реально ли это сделать в рамках Cryptography API, и если да, то как?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    _DEN_
    CryptGenKey() имеет опорную функу advapi!SystemFunction036(), а она(из advapi!GatherRandomKeyFastUserMode()) выполняет запрос к ksecdd.sys, там GatherRandomKey() завязана на счётчик тиков ядра(KeTickCount). Посему нет смысла вводить опорные значения(seed).
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Clerk

    Зачем тогда юзера просят помогать рандому своим инпутом? Например - при создании кошелька webmoney.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    _DEN_
    Не знаю. Вероятно там иные механизмы вычисления работают, к примеру CryptGenRandom() не имеет в параметрах Seed'а.
    Кстате GatherRandomKey() есчо и к железу привязана(cpuid).
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Clerk

    Но все-таки, на всякий случай. Можно ли "по-белому" накормить CryptGenKey своими seed-ами?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    _DEN_
    Видимо да. Есть три функи ReadSeed(), WriteSeed() и AccessSeed(). Юзает ключ "\Registry\Machine\SOFTWARE\Microsoft\Cryptography\RNG", "Seed". Наверно то что нужно.
     
  7. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    А нельзя заюзать RtlRandomEx, и потом експортнуть?
     
  8. Noga

    Noga New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2008
    Сообщения:
    92
    Так как "рандом" в Windows выдаёт не совсем уж рандомные числа. Смарт-карты(за все не ручаюсь) при генереции ПСЧ используют шумы от нестабильности системы в целом.

    Инициализируйте 2 переменные размером по 1 байту, заполните их "рандомными" значениями, примените к ним операцию математического усложнения. Выходным результатом у вас будет 2 байта.
    После того как Вы сгенерируете достаточный числовой массив, подвергайте его статистическому контролю.
     
  9. Scratch

    Scratch New Member

    Публикаций:
    0
    Регистрация:
    1 янв 2005
    Сообщения:
    161
    Пишите своего криптопровайдера, предоставляющего ГСЧ или используйте нормальные библиотеки вроде OpenSSL вместо мастдаевской поделки внутри которой хрен знает что.
     
  10. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    Или RSAREF можно использовать - там есть функция InitRandomStruct (в которой можно задать seed руками) - да и по использованию она проще чем CryptoAPI, плюс в открытом виде поставляется
     
  11. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.734
    Его не устраивает потому что он не знает как это работает.

    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 поместить свои данные в выходной буфер. Эти данные так же будут использованны при генерации.
     
  12. _derivative

    _derivative New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2011
    Сообщения:
    8
    Заколотить случайные значения в буфер, посчитать хэш, CryptDeriveKey?
     
  13. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    дату видел?))