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

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

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

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

1 ответ

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


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

  1. Позвоните CryptAcquireContext функция для получения доступа к провайдеру шифрования Microsoft Diffie-Hellman.
  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 функция.
Другие вопросы по тегам