다음을 통해 공유


CryptCreateHash 함수(wincrypt.h)

중요 이 API는 더 이상 사용되지 않습니다. 신규 및 기존 소프트웨어는 암호화 차세대 API 사용을 시작해야 합니다. Microsoft는 이후 릴리스에서 이 API를 제거할 수 있습니다.
 
CryptCreateHash 함수는 데이터 스트림의 해시를 시작합니다. CSP( 암호화 서비스 공급자 ) 해시 개체에 대한 핸들을 호출하는 애플리케이션에 만들고 반환합니다. 이 핸들은 CryptHashDataCryptHashSessionKey 에 대한 후속 호출에서 세션 키 및 기타 데이터 스트림을 해시하는 데 사용됩니다.

구문

BOOL CryptCreateHash(
  [in]  HCRYPTPROV hProv,
  [in]  ALG_ID     Algid,
  [in]  HCRYPTKEY  hKey,
  [in]  DWORD      dwFlags,
  [out] HCRYPTHASH *phHash
);

매개 변수

[in] hProv

CryptAcquireContext를 호출하여 만든 CSP에 대한 핸들입니다.

[in] Algid

사용할 해시 알고리즘을 식별하는 ALG_ID 값입니다.

이 매개 변수의 유효한 값은 사용되는 CSP에 따라 달라집니다. 기본 알고리즘 목록은 비고를 참조하세요.

[in] hKey

해시 알고리즘 유형이 HMAC( 해시 기반 메시지 인증 코드 ) 또는 MAC( 메시지 인증 코드 ) 알고리즘과 같은 키 해시인 경우 해시의 키가 이 매개 변수에 전달됩니다. 키가 아닌 알고리즘의 경우 이 매개 변수를 0으로 설정해야 합니다.

키 알고리즘의 경우 키는 CBC(암호 블록 체인)의 암호화 모드가 있는 RC2와 같은 블록암호화 키에 있어야 합니다.

[in] dwFlags

다음 플래그 값이 정의됩니다.

의미
CRYPT_SECRETDIGEST
0x00000001
이 플래그는 사용되지 않습니다.

[out] phHash

함수가 핸들을 새 해시 개체에 복사하는 주소입니다. 해시 개체 사용을 마쳤으면 CryptDestroyHash 함수를 호출하여 핸들을 해제합니다.

반환 값

함수가 성공하면 함수는 TRUE를 반환합니다.

함수가 실패하면 FALSE를 반환합니다. 확장된 오류 정보는 GetLastError를 호출합니다.

NTE가 미리 입력한 오류 코드는 사용 중인 특정 CSP에 의해 생성됩니다. 다음 표에서는 몇 가지 가능한 오류 코드를 보여 줍니다.

반환 코드 설명
ERROR_INVALID_HANDLE
매개 변수 중 하나는 유효하지 않은 핸들을 지정합니다.
ERROR_INVALID_PARAMETER
매개 변수 중 하나에는 유효하지 않은 값이 포함되어 있습니다. 이는 가장 자주 유효하지 않은 포인터입니다.
ERROR_NOT_ENOUGH_MEMORY
작업 중에 운영 체제에 메모리가 부족합니다.
NTE_BAD_ALGID
Algid 매개 변수는 이 CSP가 지원하지 않는 알고리즘을 지정합니다.
NTE_BAD_FLAGS
dwFlags 매개 변수가 0이 아닌 경우
NTE_BAD_KEY
CALG_MAC 같은 키 해시 알고리즘은 Algid에 의해 지정되고 hKey 매개 변수는 0이거나 유효하지 않은 키 핸들을 지정합니다. 이 오류 코드는 키가 스트림 암호화 에 있는 경우 또는 암호화 모드가 CBC 이외의 항목인 경우에도 반환됩니다.
NTE_NO_MEMORY
작업 중에 CSP 메모리가 부족했습니다.

설명

Microsoft 서비스 공급자 목록 및 구현하는 알고리즘은 Microsoft Cryptographic Service Providers를 참조하세요.

실제 해시의 계산은 CryptHashDataCryptHashSessionKey 함수를 사용하여 수행됩니다. 해시 개체에 대한 핸들이 필요합니다. 모든 데이터가 해시 개체에 추가된 후 다음 작업을 수행할 수 있습니다.

이 목록의 함수 중 하나가 호출되면 CryptHashDataCryptHashSessionKey 를 호출할 수 없습니다.

예제

다음 예제에서는 데이터 스트림의 해시를 시작하는 방법을 보여줍니다. 호출 애플리케이션에 해시 개체에 대한 핸들을 만들고 반환합니다. 이 핸들은 모든 데이터 스트림을 해시하기 위해 CryptHashDataCryptHashSessionKey 에 대한 후속 호출에 사용됩니다. 이 예제의 전체 컨텍스트를 포함하는 예제는 예제 C 프로그램: 세션 키 만들기 및 해시를 참조하세요. 이 함수를 사용하는 또 다른 예제는 예제 C 프로그램: 해시 서명 및 해시 서명 확인을 참조하세요.

//--------------------------------------------------------------------
//  Declare variables.

HCRYPTPROV hCryptProv;
HCRYPTHASH hHash;

//--------------------------------------------------------------------
// Get a handle to a cryptography provider context.


if(CryptAcquireContext(
   &hCryptProv, 
   NULL, 
   NULL, 
   PROV_RSA_FULL, 
   0)) 
{
    printf("CryptAcquireContext complete. \n");
}
else
{
     printf("Acquisition of context failed.\n");
     exit(1);
}
//--------------------------------------------------------------------
// Acquire a hash object handle.

if(CryptCreateHash(
   hCryptProv, 
   CALG_MD5, 
   0, 
   0, 
   &hHash)) 
{
    printf("An empty hash object has been created. \n");
}
else
{
    printf("Error during CryptBeginHash!\n");
    exit(1);
}

// Insert code that uses the hash object here.

//--------------------------------------------------------------------
// After processing, hCryptProv and hHash must be released.

if(hHash) 
   CryptDestroyHash(hHash);
if(hCryptProv) 
   CryptReleaseContext(hCryptProv,0);

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows XP [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 wincrypt.h
라이브러리 Advapi32.lib
DLL Advapi32.dll

추가 정보

CryptAcquireContext

CryptDeriveKey

CryptDestroyHash

CryptGetHashParam

CryptHashData

CryptHashSessionKey

CryptSetHashParam

CryptSignHash

CryptVerifySignature

해시 및 디지털 서명 함수