Я использую Wincrypt для Diffie-Hellman - могу ли я экспортировать общий секрет в виде простого текста? - PullRequest
4 голосов
/ 18 сентября 2008

ОК - благодаря Майку , я смог заставить Винкрипта сгенерировать пару ключей Диффи-Хеллмана. Я выяснил, как экспортировать открытый ключ, и как импортировать открытый ключ другой стороны. Согласно документам, при импорте открытого ключа другой стороны, общий секрет был вычислен. Отлично.

Теперь мне нужно раскрыть этот общий секрет, но я не думаю, что это возможно. Простой вызов CryptExportKey с типом PLAINTEXTKEYBLOB не удастся, если я не вызову CryptSetKeyParam, чтобы изменить идентификатор алгоритма с CALG_AGREEDKEY_ANY на что-то ... еще. Но я не хочу что-то еще, я хочу общий секрет. API, однако, похоже, призван препятствовать этому.

Есть идеи? Должен отметить, что проблема в том, что я пишу только одну сторону реализации WiFi Protected Setup. Таким образом, протокол определен для меня, и другая сторона не дает мне HCRYPTKEY.

1 Ответ

2 голосов
/ 19 сентября 2008

Это похоже на то, что вам нужно ... от: http://msdn.microsoft.com/en-us/library/aa381969(VS.85).aspx


Чтобы импортировать открытый ключ Диффи-Хеллмана и вычислить секретный сеансовый ключ

  1. Вызовите функцию CryptAcquireContext, чтобы получить указатель на криптографического провайдера Microsoft Диффи-Хеллмана.
  2. Создайте ключ Диффи-Хеллмана, вызвав функцию CryptGenKey для создания нового ключа или вызвав функцию CryptGetUserKey для получения существующего ключа.
  3. Чтобы импортировать открытый ключ Диффи-Хеллмана в CSP, вызовите функцию CryptImportKey, передав указатель на BLOB открытого ключа в параметре pbData, длину BLOB в параметре dwDataLen и дескриптор ключа Диффи-Хеллмана в параметре hPubKey. Это приводит к выполнению вычисления (Y^X) mod P, в результате чего создается общий секретный ключ и завершается обмен ключами. Этот вызов функции возвращает дескриптор нового секретного ключа сеанса в параметре hKey.
  4. На данный момент импортированный Диффи-Хеллман имеет тип CALG_AGREEDKEY_ANY. Прежде чем ключ можно будет использовать, он должен быть преобразован в тип ключа сеанса. Это достигается путем вызова функции CryptSetKeyParam с dwParam, установленным на KP_ALGID и с pbData, установленным на указатель на значение ALG_ID, представляющее ключ сеанса, например CALG_RC4. Ключ должен быть преобразован перед использованием общего ключа в функции CryptEncrypt или CryptDecrypt. Вызовы, сделанные к одной из этих функций до преобразования типа ключа, завершатся неудачей.
  5. Секретный сеансовый ключ теперь готов к использованию для шифрования или дешифрования.
  6. Когда ключ больше не нужен, уничтожьте ручку ключа, вызвав функцию CryptDestroyKey.
...