MS CryptoAPI не работает в Windows XP с CryptAcquireContext () - PullRequest
3 голосов
/ 21 марта 2012

Я написал код, используя Microsoft CryptoAPI для вычисления SHA-1, и получил скомпилированный exe-файл, работающий на Windows 7, Win Server 2008, Win Server 2003. Однако, когда я запускаю его под Windows XP SP3, он не работает,

Я сузил ошибку до вызова CryptAcquireContext().

Я заметил, что предыдущий пост говорил о неверном именовании XP "… ((Прототип)", и его необходимо учитывать с помощью специального макроса WinXP MS_ENH_RSA_AES_PROV_XP.

Я сделал специфичные для XP модификации кода, и они все еще не работают.(bResult возвращает 0 false в Win XP, все остальные платформы bResult возвращает 1 true.)

Я проверил MS_ENH_RSA_AES_PROV_XP с фактическими ключами + строковыми значениями, которые я вижу в regedit.exe, поэтому все выглядит такон настроен на работу, но безуспешно.

Я что-то упустил, чтобы заставить его работать в Windows XP?

Я привел кратчайший возможный пример, чтобы проиллюстрировать проблему.Я использовал VS2010 C ++.

// based on examples from http://msdn.microsoft.com/en-us/library/ms867086.aspx

#include "windows.h"
#include "wincrypt.h"
#include <iostream>
#include <iomanip>  // for setw()

void main()
{
    BOOL bResult;
    HCRYPTPROV hProv;

    // Attempt to acquire a handle to the default key container.
    bResult = CryptAcquireContext(
        &hProv,            // Variable to hold returned handle.
        NULL,              // Use default key container.
        MS_DEF_PROV,       // Use default CSP.
        PROV_RSA_FULL,     // Type of provider to acquire.
        0);                // No special action.
    std::cout << "line:  " << std::setw(4) << __LINE__ << ";  " << "bResult = " << bResult << std::endl;

    if (! bResult) {        // try Windows XP provider name
        bResult = CryptAcquireContext(
            &hProv,            // Variable to hold returned handle.
            NULL,              // Use default key container.
            MS_ENH_RSA_AES_PROV_XP,  // Windows XP specific instead of using default CSP.
            PROV_RSA_AES,     // Type of provider to acquire.
            0);                // No special action.
        std::cout << "line:  " << std::setw(4) << __LINE__ << ";  " << "bResult = " << bResult << std::endl;
    }

    if (bResult)
        CryptReleaseContext(hProv, 0);
}

Успех Windows 7: enter image description here

Ошибка Windows XP: enter image description here

1 Ответ

5 голосов
/ 21 марта 2012

В вашем коде CryptAcquireContext кажется, что вам не хватает параметра для получения контекста без определенного набора контейнеров.Вам нужно передать опцию CRYPT_VERIFYCONTEXT в CryptAcquireContext.

Возможно, в Windows 7 обойдется.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa379886(v=vs.85).aspx

Для дальнейшей диагностики результаты GetLastError () будутбыть реквизитом.

...