Крипто-Про CSP |
//-------------------------------------------------------------------- // Пример кода для работы в режиме SILENT, без окон. // В данном примере осуществляется подпись строки. // Для корректной работы этой программы необходимо создать контейнер с // именем "Source" и с паролем "1234". При этом в контейнере должны // существовать оба ключа (ключ обмена и ключ подписи). //-------------------------------------------------------------------- void HandleError(char *s); int main(void) { //-------------------------------------------------------------------- // Объявление и инициализация переменных. HCRYPTPROV hProv; // Дескриптор CSP HCRYPTKEY hKey; // Дескриптор ключа BYTE *pbBuffer= (BYTE *)"The data that is to be hashed and signed."; DWORD dwBufferLen = (DWORD)(strlen((char *)pbBuffer)+1); BYTE *pbHash; DWORD cbHash; HCRYPTHASH hHash; BYTE *pbKeyBlob; BYTE *pbSignature; DWORD dwSigLen; DWORD dwBlobLen; FILE *signature; //-------------------------------------------------------------------- // Получение дескриптора провайдера. if(CryptAcquireContext( &hProv, "\\\\.\\Registry\\Source", NULL, 75, CRYPT_SILENT)) { printf("CryptAcquireContext succeeded.\n"); } else { if (GetLastError() == 0x80090016 ) { printf(" The key container with name \"Source\" does not exist.\n"); printf(" Create a container and generate keys \n"); exit(0); } else { HandleError("A genral error runing CryptAcquireContext."); } } //-------------------------------------------------------------------- // Установка параметров в соответствии с паролем. if(CryptSetProvParam( hProv, PP_KEYEXCHANGE_PIN, (BYTE*)"1234", 0)) { printf("CryptSetProvParam succeeded.\n"); } else { HandleError("Error during CryptSetProvParam."); } //-------------------------------------------------------------------- // Получение ключа пользователя. if(CryptGetUserKey( hProv, AT_KEYEXCHANGE, &hKey)) { printf("CryptGetUserKey succeeded.\n"); } else { HandleError("Error during CryptGetUserKey."); } //-------------------------------------------------------------------- // Экпорт открытого ключа. Здесь открытый ключ экспортируется в // PUBLICKEYBOLB для того, чтобы получатель подписанного хеша мог // проверить подпись. Этот BLOB может быть записан в файл и передан // другому пользователю. if(CryptExportKey( hKey, 0, PUBLICKEYBLOB, 0, NULL, &dwBlobLen)) { printf("Size of the BLOB for the public key determined. \n"); } else { if (GetLastError() == 0x8009000b ) { printf(" The password of key container is differ from \"1234\".\n"); exit(0); } else { HandleError("Error computing BLOB length."); } } //-------------------------------------------------------------------- // Распределение памяти под pbKeyBlob. pbKeyBlob = (BYTE*)malloc(dwBlobLen); if(pbKeyBlob) { printf("Memory has been allocated for the BLOB. \n"); } else { HandleError("Out of memory. \n"); } //-------------------------------------------------------------------- // Сам экспорт в ключевой BLOB. if(CryptExportKey( hKey, 0, PUBLICKEYBLOB, 0, pbKeyBlob, &dwBlobLen)) { printf("Contents have been written to the BLOB. \n"); } else { HandleError("Error during CryptExportKey."); } //-------------------------------------------------------------------- // Создание объекта функции хеширования. if(CryptCreateHash( hProv, CALG_GR3411, 0, 0, &hHash)) { printf("Hash object created. \n"); } else { HandleError("Error during CryptCreateHash."); } //-------------------------------------------------------------------- // Передача параметра HP_OID объекта функции хеширования. //-------------------------------------------------------------------- //-------------------------------------------------------------------- // Определение размера BLOBа и распределение памяти. if(CryptGetHashParam(hHash, HP_OID, NULL, &cbHash, 0)) { printf("Size of the BLOB determined. \n"); } else { HandleError("Error computing BLOB length."); } pbHash = (BYTE*)malloc(cbHash); if(pbHash) { printf("Memory has been allocated for the pbHash. \n"); } else { HandleError("Out of memory. \n"); } //-------------------------------------------------------------------- // Копирование параметра HP_OID в pbHash. if(CryptGetHashParam(hHash, HP_OID, pbHash, &cbHash, 0)) { printf("Parameters have been written to the pbHash. \n"); } else { HandleError("Error during CryptGetHashParam."); } //-------------------------------------------------------------------- // Вычисление криптографического хеша буфера. if(CryptHashData( hHash, pbBuffer, dwBufferLen, 0)) { printf("The data buffer has been hashed.\n"); } else { HandleError("Error during CryptHashData."); } //-------------------------------------------------------------------- // Определение размера подписи и распределение памяти. dwSigLen= 0; if(CryptSignHash( hHash, AT_SIGNATURE, NULL, 0, NULL, &dwSigLen)) { printf("Signature length %d found.\n",dwSigLen); } else { HandleError("Error during CryptSignHash."); } //-------------------------------------------------------------------- // Распределение памяти под буфер подписи. pbSignature = (BYTE *)malloc(dwSigLen); if(pbSignature) { printf("Memory allocated for the signature.\n"); } else { HandleError("Out of memory."); } //-------------------------------------------------------------------- // Подпись объекта функции хеширования. if(CryptSignHash( hHash, AT_SIGNATURE, NULL, 0, pbSignature, &dwSigLen)) { printf("pbSignature is the hash signature.\n"); } else { HandleError("Error during CryptSignHash."); } signature = fopen( "signature.txt", "w+b" ); if(!signature) HandleError( "Problem opening the file\n" ); fwrite (pbSignature, 1, dwSigLen, signature); //-------------------------------------------------------------------- // Уничтожение объекта функции хеширования. if(hHash) CryptDestroyHash(hHash); printf("The hash object has been destroyed.\n"); printf("The signature is created.\n\n"); // Уничтожение дескриптора ключа пользователя. if(hKey) CryptDestroyKey(hKey); // Освобождение дескриптора провайдера. if(hProv) CryptReleaseContext(hProv, 0); printf("The program ran to completion without error. \n"); return 0; } // Конец main
Windows 2000/XP/2003: Необходимо Windows 2000 SP4 или
старше с Internet Explorer 6.0 или старше.
Windows NT/95/98/ME: CSP 3.0 не поддерживает (см. КриптоПро CSP
2.0 ).
Solaris: 9 Update 4 или выше.
FreeBSD: FreeBSD 5.2 или выше
Linux: RedHat 7.3, RedHad 9.0.
Ядро Windows NT: не поддерживает.
Что Вы
думаете по поводу данной статьи? |
Закажите CD c Крипто-Про CSP |