28.11.2002 14:53:42Первое знакомство с CryptoAPI Ответов: 1
Паша
Добрый день джентльмены.
Решил я узнать поближе, что есть CryptoAPI. Стал разбираться с примерами из Windows SDK в C++Builder 5.
Запустил пример, который приводился с функцией CryptSignHash.

#include <wincrypt.h>

HCRYPTPROV hProv = 0;
#define BUFFER_SIZE 256
BYTE pbBuffer[BUFFER_SIZE];
HCRYPTHASH hHash = 0;
BYTE *pbSignature = NULL;
DWORD dwSigLen;
LPTSTR szDescription = TEXT("Test Data");
DWORD i;

// Get handle to the default provider.
if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) {
printf("Error %x during CryptAcquireContext!\n", GetLastError());
goto done;
}

// Fill buffer with test data.
for(i = 0 ; i < BUFFER_SIZE ; i++) {

pbBuffer[i] = (BYTE)i;
}

// Create hash object.
if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {
printf("Error %x during CryptCreateHash!\n", GetLastError());
goto done;
}

// Hash buffer.
if(!CryptHashData(hHash, pbBuffer, BUFFER_SIZE, 0)) {
printf("Error %x during CryptHashData!\n", GetLastError());
goto done;
}

// Determine size of signature and allocate memory.
dwSigLen = 0;
if(!CryptSignHash(hHash, AT_SIGNATURE, TEXT(""), 0, NULL, &dwSigLen)) {

printf("Error %x during CryptSignHash!\n", GetLastError());
if(GetLastError()!=NTE_BAD_LEN) goto done;
}
if((pbSignature = malloc(dwSigLen)) == NULL) {
printf("Out of memory!\n");
goto done;
}

// Sign hash object.
if(!CryptSignHash(hHash, AT_SIGNATURE, szDescription, 0, pbSignature, &dwSigLen)) {
printf("Error %x during CryptSignHash!\n", GetLastError());
goto done;
}

// Store or transmit the signature, test buffer, and description string.

...

done:

// Free memory used to store signature.
if(pbSignature != NULL) free(pbSignature);

// Destroy hash object.
if(hHash != 0) CryptDestroyHash(hHash);

// Release provider handle.
if(hProv != 0) CryptReleaseContext(hProv, 0);

Кое-что сработало -
CryptAcquireContext,
CryptCreateHash,
CryptHashData.
А вот функция CryptSignHash выдала ошибку, причём весьма странную - NTE_BAD_KEYSET!
Может кто знает, в чём дело?
 
Ответы:
29.11.2002 11:01:00kure
Скачайте наши примеры.

"Как пользоваться" http://www.cryptopro.ru/CryptoPro/products/csp4.asp

http://www.cryptopro.ru/CryptoPro/test/sample.zip

У вас нет ключа, чтобы подписывать.