Расшифровать ключ профиля WEP wlan с помощью CryptUnprotectData

Я пытаюсь расшифровать ключ профиля WEP с помощью CryptUnprotectData. Способ, которым я извлек ключ профиля, - это экспорт профиля с помощью netsh.

netsh wlan export profile name="MyWEP" folder="./"

на данный момент я вручную скопировал ключевой материал из.xml-файл, созданный командой netsh для моей программы. И способ, который я расшифровываю -

DATA_BLOB DataOut, DataVerify;
DataOut.cbData = encryptData.length();
DataOut.pbData = (BYTE*)("I_Manually_Copy_The_WEP_Key_Here");

if (CryptUnprotectData( &DataOut,
                        NULL,
                        NULL,
                        NULL,
                        NULL,
                        0,
                        &DataVerify))
{
    printf("The decrypted data is: %sn", DataVerify.pbData);
}
else
{
    printf("Failed. Error Code: %d", GetLastError());
}

, но я получаю код ошибки 13 ссылаясь на неверные данные. Что я делаю не так ? На Win 7 и более поздних версиях я могу напрямую использовать WlanGetProfile с параметром WLAN_PROFILE_GET_PLAINTEXT_KEY . Но у меня есть!--9-->нет на Vista чем использовать функцию CryptUnprotectData. Я видел похожие сообщения здесь, здесь но не получил много полезной информации. Кроме того, я использую ту же систему с теми же учетными данными входа пользователя. Кто-нибудь может подсказать мне, что делать дальше ?

PS: я разместил тот же вопрос на Форумы Windows Desktop SDK, но еще не получили ответа. Испытываю свою удачу на SO.

1 ответов


мне нравятся вопросы о безопасности Windows. Поэтому, если я иногда вижу такое, я пытаюсь его решить.

в вашем случае вы уже сделали первый шаг за использование netsh.exe wlan export profile ... для экспорта данных из профиля WLAN в XML-файл. Файл содержит <keyMaterial> элемент. Данные внутри элемента являются двоичными данными, закодированными как Hex: (что-то вроде 01000000D08C9DDF0115D1118C7A00C0...).

Итак, что вам нужно сделать, прежде всего, это декодировать строку в двоичные данные. Вы можете использовать CryptStringToBinary С CRYPT_STRING_HEX параметр для декодирования строки в двоичный код.

следующим шагом будет заполнить DATA_BLOB с двоичными данными и вызов CryptUnprotectData получить результат, но... Есть небольшая проблема. Как вы можете прочитать в документации WlanGetProfile следующее

по умолчанию keyMaterial элемент, возвращаемый в профиле, указанном к pstrProfileXml is зашифрованный. Если процесс выполняется в контекст LocalSystem учетная запись на том же компьютере, то вы можете unencrypt ключевой материал, вызвав CryptUnprotectData