13.09.2005 20:35:41Подпись сообщения Ответов: 3
Игорь
Добрый день всем.
Возник вопрос. При интеграции с некоторой системой. Дали мне сертификат с private key. Необходимо создать hash md5, подписать private key и отправить в систему запрос.

Открываем хранилище сертификатов

HCERTSTORE hStoreHandle;

if ( !( hStoreHandle = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
NULL,
CERT_SYSTEM_STORE_CURRENT_USER,
//CERT_SYSTEM_STORE_LOCAL_MACHINE,
CERT_STORE_NAME)))
{
HandleError("Нельзя открыть хранилище MY.");
}

// Получаем указатель на наш сертификат

PCCERT_CONTEXT pSignerCert;

if(pSignerCert = CertFindCertificateInStore(
hStoreHandle,
MY_TYPE,
0,
CERT_FIND_SUBJECT_STR,
SIGNER_NAME,
NULL))
{
printf("Сертификат найден.\n");
}
else
{
HandleError( "Сертификат не найден.");
return false;
}

// через функцию CryptAcquireCertificatePrivateKey получаем доступ к CSP

HCRYPTPROV hProv;
DWORD dwKeySpec;
BOOL fCallerFreeProv;

if(CryptAcquireCertificatePrivateKey(
pSignerCert,
CRYPT_ACQUIRE_COMPARE_KEY_FLAG,
NULL,
&hProv,
&dwKeySpec,
&fCallerFreeProv
))
{
printf("CryptAcquireCertificatePrivateKey выполнилась успешно!\n");
}
else
{
HandleError(" Ошибка CryptAcquireCertificatePrivateKey.\n");
return false;
}

// Создаем пустой hash объект
HCRYPTHASH hHash;

if(CryptCreateHash(
hProv,
CALG_MD5,
0,
0,
&hHash))
{
printf("Hash объект создан.\n");
}
else
{
HandleError("Ошибка CryptCreateHash.");
return false;
}

// Вычисляем hash для нашего сообщения
if(CryptHashData(
hHash,
pbMessage,
cbMessage,
0))
{
printf("Hash объект вычислен.\n");
}
else
{
HandleError("Ошибка CryptHashData.");
return false;
}


// Переменные для указателя и длины подписи
BYTE *pbSignature;
DWORD dwSigLen;

if(CryptSignHash(
hHash,
dwKeySpec,
NULL,
0,
NULL,
&dwSigLen))
{
printf("Длина подписи %d .\n",dwSigLen);
}
else
{
HandleError("Ошибка CryptSignHash.");
return false;
}


if(pbSignature = new BYTE[dwSigLen])
{
printf("Память под подпись выделена.\n");
}
else
{
HandleError("Ошибка памяти.");
return false;
}

if(CryptSignHash(
hHash,
dwKeySpec,
NULL,
0,
pbSignature,
&dwSigLen))
{
m_iSignLen=dwSigLen;
printf("Подпись:\n");
}
else
{
HandleError("Ошибка CryptSignHash.");
return false;
}

if(pbSignature)
delete pbSignature;

if (pbMessage)
delete pbMessage;

if(hHash)
CryptDestroyHash(hHash);

if(hProv)
CryptReleaseContext(hProv, 0);

if(pSignerCert)
CertFreeCertificateContext(pSignerCert);

if(CertCloseStore(hStoreHandle, CERT_CLOSE_STORE_CHECK_FLAG))
{
printf("\nХранилище закрыто. \n");
}
else
{
HandleError("Ошибка!");
return false;
}


сообщение полученное мной и присланное мне для теста не совпадают.
Что я делаю не так.
Please HELP
 
Ответы:
14.09.2005 15:32:26Kirill Sobolev
Может хэш не от того считается?
15.09.2005 19:18:35Игорь
Спасибо за ответ.
Нет проблема я думаю в следующем.
На той стороне работают с openssl или с java а я с CryptoAPI.
MD5withRSA вот чего они хотят
16.09.2005 10:32:56Kirill Sobolev
У Вас по идее то же самое, если ключ RSA.