Крипто-Про CSP |
//-------------------------------------------------------------------- // В данном примере осуществляется хеширование строки, дублирование // полученного хеша. Затем осуществляется хеширование дополнительных // данных при помощи оригинального и дублированного хеша. //-------------------------------------------------------------------- #define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) void HandleError(char *s); void Get_And_Print_Hash(HCRYPTHASH hHash); int main(void) { //-------------------------------------------------------------------- // Объявление и инициализация переменных. HCRYPTPROV hCryptProv = 0; HCRYPTHASH hOriginalHash; HCRYPTHASH hDuplicateHash; BYTE pbData[20]; DWORD i; //------------------------------------------------------------------- // Инициализация буфера pbData. for(i=0;i<20;i++) pbData[i]=(unsigned char)i*7; //-------------------------------------------------------------------- // Получение дескриптора контекста криптографического провайдера. if(CryptAcquireContext( &hCryptProv, NULL, NULL, 75, 0)) { printf("CryptAcquireContext succeeded. \n"); } else { HandleError("Error during CryptAcquireContext!"); } //-------------------------------------------------------------------- // Создание объекта функции хеширования. if (CryptCreateHash( hCryptProv, CALG_GR3411, 0, 0, &hOriginalHash)) { printf("An empty hash object has been created. \n"); } else { HandleError("Error during CryptCreateHash."); } //-------------------------------------------------------------------- // Хеширование байтовой строки. if (CryptHashData( hOriginalHash, (BYTE*)"Some Common Data", sizeof("Some Common Data"), 0)) { printf("An original hash has been created. \n"); } else { HandleError("Error during CryptHashData."); } //-------------------------------------------------------------------- // Дублирование хеша. // Эта функция работает только в Windows 2000 и старше. if (CryptDuplicateHash( hOriginalHash, NULL, 0, &hDuplicateHash)) { printf("The hash has been duplicated. \n"); } else { HandleError("Error during CryptDuplicateHash."); } printf("The original hash -- phase 1.\n"); Get_And_Print_Hash(hOriginalHash); printf("The duplicate hash -- phase 1.\n"); Get_And_Print_Hash(hDuplicateHash); //-------------------------------------------------------------------- // Хеширование "Some Data" с оригинальным хешем. if (CryptHashData( hOriginalHash, (BYTE*)"Some Data", sizeof("Some Data"), 0)) { printf("Additional data has been hashed with the original. \n"); } else { HandleError("Error during CryptHashData."); } //-------------------------------------------------------------------- // Хеширование "Other Data" с дублированным хешем. if (CryptHashData( hDuplicateHash, (BYTE*)"Other Data", sizeof("Other Data"), 0)) { printf("More data has been hashed with the duplicate. \n"); } else { HandleError("Error during CryptHashData."); } printf("The original hash -- phase 2.\n"); Get_And_Print_Hash(hOriginalHash); printf("The duplicate hash -- phase 2.\n"); Get_And_Print_Hash(hDuplicateHash); // Уничтожение оригинального хеша. if(CryptDestroyHash(hOriginalHash)) { printf("The original hash has been destroyed. \n"); } else { HandleError("ERROR during CryptDestroyHash"); } //-------------------------------------------------------------------- // Уничтожение дублированного хеша. if (CryptDestroyHash(hDuplicateHash)) { printf("The duplicate hash has been destroyed. \n"); } else { HandleError("Error -- CryptDestroyHash"); } //-------------------------------------------------------------------- // Освобождение CSP. if(hCryptProv) CryptReleaseContext(hCryptProv,0); printf("The program ran to completion without error. \n"); return 0; } // Конец main //-------------------------------------------------------------------- // Определение функции Get_And_Print_Hash. void Get_And_Print_Hash(HCRYPTHASH hOHash) { //-------------------------------------------------------------------- // Объявление и инициализация локальных переменных. BYTE *pbHash; BYTE *pbHashSize; DWORD dwHashLen = sizeof(DWORD); DWORD i; HCRYPTHASH hHash=0; //-------------------------------------------------------------------- // Дублирование установленного хеша. // Эта функция работает только в Windows 2000 и старше. // Хеш продублирован для того, чтобы не изменять исходный хеш. if (CryptDuplicateHash( hOHash, NULL, 0, &hHash)) { // Работает. Ничего не надо делать. } else { HandleError("Error during CryptDuplicateHash."); } pbHashSize =(BYTE *) malloc(dwHashLen); if(!pbHashSize) HandleError("Memory allocation failed."); if(CryptGetHashParam( hHash, HP_HASHSIZE, pbHashSize, &dwHashLen, 0)) { // Работает. Освобождение pbHashSize. free(pbHashSize); } else { HandleError("CryptGetHashParam failed to get size."); } if(CryptGetHashParam( hHash, HP_HASHVAL, NULL, &dwHashLen, 0)) { // Работает. Ничего не надо делать. } else { HandleError("CryptGetHashParam failed to get length."); } pbHash = (BYTE*)malloc(dwHashLen); if(pbHash) { // Работает. Ничего не надо делать. } else { HandleError("Allocation failed."); } if(CryptGetHashParam( hHash, HP_HASHVAL, pbHash, &dwHashLen, 0)) { // Печать значения хеша. printf("The hash is: "); for(i = 0 ; i < dwHashLen ; i++) { printf("%2.2x ",pbHash[i]); } printf("\n"); } else { HandleError("Error during reading hash value."); } free(pbHash); if (CryptDestroyHash(hHash)) { // Работает. Ничего не надо делать. } else { HandleError("ERROR - CryptDestroyHash"); } } // Конец Get_And_Print_Hash
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 |