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