Share via


CryptGenRandom 함수(wincrypt.h)

중요 이 API는 더 이상 사용되지 않습니다. 신규 및 기존 소프트웨어는 암호화 차세대 API 사용을 시작해야 합니다. Microsoft는 이후 릴리스에서 이 API를 제거할 수 있습니다.
 
CryptGenRandom 함수는 버퍼를 암호화 임의 바이트로 채웁니다.

구문

BOOL CryptGenRandom(
  [in]      HCRYPTPROV hProv,
  [in]      DWORD      dwLen,
  [in, out] BYTE       *pbBuffer
);

매개 변수

[in] hProv

CryptAcquireContext를 호출하여 만든 CSP(암호화 서비스 공급자)의 핸들입니다.

[in] dwLen

생성할 임의 데이터의 바이트 수입니다.

[in, out] pbBuffer

반환된 데이터를 수신하는 버퍼입니다. 이 버퍼의 길이는 dwLen 바이트 이상이어야 합니다.

필요에 따라 애플리케이션은 보조 임의 시드로 사용할 데이터로 이 버퍼를 채울 수 있습니다.

반환 값

함수가 성공하면 반환 값은 0이 아닌 값(TRUE)입니다.

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

"NTE"가 앞에 있는 오류 코드는 사용 중인 특정 CSP에 의해 생성됩니다. 다음 표에는 몇 가지 가능한 오류 코드가 나열되어 있습니다.

반환 코드 설명
ERROR_INVALID_HANDLE
매개 변수 중 하나는 유효하지 않은 핸들을 지정합니다.
ERROR_INVALID_PARAMETER
매개 변수 중 하나에는 유효하지 않은 값이 포함되어 있습니다. 이는 가장 자주 유효하지 않은 포인터입니다.
NTE_BAD_UID
hProv 매개 변수에 유효한 컨텍스트 핸들이 없습니다.
NTE_FAIL
함수가 예기치 않은 방식으로 실패했습니다.

설명

이 함수에서 생성된 데이터는 암호화상 임의입니다. C 컴파일러와 함께 제공되는 것과 같은 일반적인 난수 생성기에서 생성된 데이터보다 훨씬 더 임의입니다.

이 함수는 임의 초기화 벡터솔트 값을 생성하는 데 자주 사용됩니다.

소프트웨어 난수 생성기는 근본적으로 동일한 방식으로 작동합니다. 시드라고 하는 난수로 시작한 다음 알고리즘을 사용하여 이를 기반으로 의사 임의 비트 시퀀스를 생성합니다. 이 프로세스에서 가장 어려운 부분은 실제로 임의인 시드를 가져오는 것입니다. 이는 일반적으로 사용자 입력 대기 시간 또는 하나 이상의 하드웨어 구성 요소의 지터를 기반으로 합니다.

Microsoft CSP를 사용하는 CryptGenRandom 은 다른 보안 구성 요소에서 사용하는 것과 동일한 난수 생성기를 사용합니다. 이를 통해 수많은 프로세스가 시스템 차원의 시드에 기여할 수 있습니다. CryptoAPI는 모든 사용자와 중간 임의 시드를 저장합니다. 난수 생성기의 시드를 형성하기 위해 호출 애플리케이션은 저장된 시드 및 다양한 시스템 데이터와 프로세스 ID, 스레드 ID, 시스템 클록, 시스템 시간, 시스템 카운터와 같은 사용자 데이터와 결합되는 instance, 마우스 또는 키보드 타이밍 입력에 대해 있을 수 있는 비트를 제공합니다. 메모리 상태, 사용 가능한 디스크 클러스터, 해시된 사용자 환경 블록. 이 결과는 Pseudorandom 번호 생성기(PRNG)를 시드하는 데 사용됩니다. Windows Vista SP1(서비스 팩 1) 이상에서는 NIST Special Publication 800-90에 지정된 AES 카운터 모드 기반 PRNG 구현이 사용됩니다. Windows Vista, Windows Storage Server 2003 및 Windows XP에서는 FIPS(Federal Information Processing Standard) 186-2에 지정된 PRNG가 사용됩니다. 애플리케이션이 좋은 임의 원본에 액세스할 수 있는 경우 CryptGenRandom을 호출하기 전에 pbBuffer 버퍼를 임의의 데이터로 채울 수 있습니다. 그런 다음 CSP는 이 데이터를 사용하여 내부 시드를 추가로 임의화합니다. CryptGenRandom을 호출하기 전에 pbBuffer 버퍼를 초기화하는 단계를 생략할 수 있습니다.

예제

다음 예제에서는 8개 임의 바이트를 생성합니다. 이러한 키는 암호화 키를 만들거나 난수를 사용하는 애플리케이션에 사용할 수 있습니다. 이 예제의 전체 컨텍스트를 포함하는 예제는 예제 C 프로그램: 세션 키 복제를 참조하세요.

//--------------------------------------------------------------------
// Declare and initialize variables.

HCRYPTPROV   hCryptProv;
BYTE         pbData[16];

//--------------------------------------------------------------------
//  This code assumes that a cryptographic context has been acquired 
//  For code details, see "Example C Program: Duplicating a Session 
//  Key."

//--------------------------------------------------------------------
// Generate a random initialization vector.

if(CryptGenRandom(
   hCryptProv, 
   8, 
   pbData)) 
{
     printf("Random sequence generated. \n");
}
else
{
     printf("Error during CryptGenRandom.\n");
     exit(1);
}

요구 사항

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

추가 정보

CryptAcquireContext

CryptGenKey

CryptSetKeyParam

키 생성 및 Exchange 함수