Крипто-Про CSP |
//-------------------------------------------------------------------- // Пример создания хеша из содержимого файла. Имя файла задается в // командной строке и является обязательным параметром. //-------------------------------------------------------------------- #define BUFSIZE 1024 #define GR3411LEN 64 int main(int argc, char *argv[]) { //------------------------------------------------------------- // Объявление и инициализация переменных. DWORD dwStatus = 0; BOOL bResult = FALSE; HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0; FILE* hFile; BYTE rgbFile[BUFSIZE]; DWORD cbRead = 0; BYTE rgbHash[GR3411LEN]; DWORD cbHash = 0; CHAR rgbDigits[] = "0123456789abcdef"; //-------------------------------------------------------------------- // Проверка того, передано ли имя файла. if (argv[1] == NULL) { printf("The file name is absent.\n"); return 1; } //-------------------------------------------------------------------- // Открытие файла. hFile = fopen( argv[1], "r+b" ); if(hFile) { printf( "The file %s was opened\n", argv[1]); } else { dwStatus = GetLastError(); printf("Error opening file %s\nError: %d\n", argv[1], dwStatus); return dwStatus; } //-------------------------------------------------------------------- // Получение дескриптора криптопровайдера. if (!CryptAcquireContext( &hProv, NULL, NULL, 75, CRYPT_VERIFYCONTEXT)) { dwStatus = GetLastError(); printf("CryptAcquireContext failed: %d\n", dwStatus); fclose(hFile); return dwStatus; } //-------------------------------------------------------------------- // Создание пустого объекта функции хеширования. if (!CryptCreateHash(hProv, CALG_GR3411, 0, 0, &hHash)) { dwStatus = GetLastError(); printf("CryptAcquireContext failed: %d\n", dwStatus); fclose(hFile); CryptReleaseContext(hProv, 0); return dwStatus; } if (!CryptSetHashParam(hHash,HP_OID,(BYTE*)OID_HashTest, 0)) { dwStatus = GetLastError(); printf("CryptAcquireContext failed: %d\n", dwStatus); CryptReleaseContext(hProv, 0); return dwStatus; } //-------------------------------------------------------------------- // Чтение данных из файла и хеширование этих данных. do { cbRead = (DWORD)fread(rgbFile, 1, BUFSIZE, hFile); if (!cbRead) { bResult = TRUE; break; } if (!CryptHashData(hHash, rgbFile, cbRead, 0)) { dwStatus = GetLastError(); printf("CryptHashData failed: %d\n", dwStatus); CryptReleaseContext(hProv, 0); CryptDestroyHash(hHash); fclose(hFile); return dwStatus; } } while (!feof(hFile)); if (bResult) { dwStatus = GetLastError(); printf("ReadFile failed: %d\n", dwStatus); CryptReleaseContext(hProv, 0); CryptDestroyHash(hHash); fclose(hFile); return dwStatus; } cbHash = GR3411LEN; //-------------------------------------------------------------------- // Получение параметра объекта функции хеширования. if (CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0)) { printf("GR3411 hash of file %s is: ", argv[1]); for (DWORD i = 0; i < cbHash; i++) { printf("%c%c", rgbDigits[rgbHash[i] >> 4], rgbDigits[rgbHash[i] & 0xf]); } printf("\n"); } else { dwStatus = GetLastError(); printf("CryptGetHashParam failed: %d\n", dwStatus); } //-------------------------------------------------------------------- // Освобождение. CryptDestroyHash(hHash); CryptReleaseContext(hProv, 0); fclose(hFile); return dwStatus; } // Конец 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 |