CryptGenRandom 함수(wincrypt.h)
구문
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에 의해 생성됩니다. 다음 표에는 몇 가지 가능한 오류 코드가 나열되어 있습니다.
반환 코드 | 설명 |
---|---|
|
매개 변수 중 하나는 유효하지 않은 핸들을 지정합니다. |
|
매개 변수 중 하나에는 유효하지 않은 값이 포함되어 있습니다. 이는 가장 자주 유효하지 않은 포인터입니다. |
|
hProv 매개 변수에 유효한 컨텍스트 핸들이 없습니다. |
|
함수가 예기치 않은 방식으로 실패했습니다. |
설명
이 함수에서 생성된 데이터는 암호화상 임의입니다. 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 |