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

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

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

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


person Community    schedule 17.09.2008    source источник
comment
Было ли когда-нибудь решение по этому поводу? Столкнулся с похожей проблемой...   -  person Julio    schedule 14.12.2015


Ответы (1)


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


Импорт открытого ключа Диффи-Хеллмана и вычисление секретного сеансового ключа

  1. Вызовите функцию CryptAcquireContext, чтобы получить дескриптор Microsoft Diffie-Hellman Cryptographic Provider.
  2. Создайте ключ Диффи-Хеллмана, вызвав функцию CryptGenKey для создания нового ключа или вызвав функцию CryptGetUserKey для извлечения существующего ключа.
  3. Чтобы импортировать открытый ключ Диффи-Хеллмана в CSP, вызовите функцию CryptImportKey, передав указатель на большой двоичный объект открытого ключа в параметре pbData, длину большого двоичного объекта в параметре dwDataLen и дескриптор ключа Диффи-Хеллмана в параметре pbData. параметр hPubKey. Это приводит к выполнению вычисления (Y^X) mod P, в результате чего создается общий секретный ключ и завершается обмен ключами. Этот вызов функции возвращает дескриптор нового секретного ключа сеанса в параметре hKey.
  4. На данный момент импортированный алгоритм Диффи-Хеллмана имеет тип CALG_AGREEDKEY_ANY. Прежде чем ключ можно будет использовать, его необходимо преобразовать в тип сеансового ключа. Это достигается путем вызова функции CryptSetKeyParam с dwParam, установленным в KP_ALGID, и с pbData, установленным в указатель на значение ALG_ID, представляющее сеансовый ключ, например CALG_RC4. Ключ необходимо преобразовать перед использованием общего ключа в функции CryptEncrypt или CryptDecrypt. Вызовы любой из этих функций до преобразования типа ключа завершатся ошибкой.
  5. Теперь секретный сеансовый ключ готов к использованию для шифрования или дешифрования.
  6. Когда ключ больше не нужен, уничтожьте дескриптор ключа, вызвав функцию CryptDestroyKey.
person Richard    schedule 18.09.2008
comment
+1 @Richard, аккуратное объяснение. Ваше предложение поможет решить схему согласования ключей, но если меня интересует транспортировка ключей с использованием DH, как я могу выполнить эту задачу для PKI? - person Raj; 20.07.2011