Я написал код, используя 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:
Ошибка Windows XP: