이전 포스트에서 rand() 함수의 취약점을 설명하였다.


rand() 함수를 보완한 랜덤 함수가 CryptGenRandom() 함수이다.


CryptGenRandom 함수는 crpytographic service provider(CSP)를 이용한 랜덤 함수로 암호학적으로 랜덤하게 난수값을 생성한다. 다만, rand() 함수에 비해 매우 느리다는 단점이 있다.


사용 방법은 아래와 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "stdafx.h"
#include <Windows.h>
#include <STDIO.H>
#include <Wincrypt.h>
 
#define MAX_RANDOM_NUM 100
 
int main(int argc, char* argv[])
{
    //--------------------------------------------------------------------
    // 변수를 선언하고 초기화 합니다.
    HCRYPTPROV   hCryptProv;
    BYTE         pbData;
 
    //-------------------------------------------------------------------
    // 암호 제공자의 컨텍스트 핸들을 얻습니다.
    if (CryptAcquireContext(&hCryptProv, NULLNULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
    {
        printf("New CryptAcquireContext succeeded. \n");
    }
    else
    {
        printf("Error 0x%x during CryptAcquireContext!\n", GetLastError());
        goto ERR;
    }
 
    //--------------------------------------------------------------------
    // BYTE 범위내에서 난수를 생성합니다.
    if(CryptGenRandom(hCryptProv, 1&pbData)) 
    {
        printf("Random number is: %d.\n", ((int)pbData) * MAX_RANDOM_NUM / 255);
    }
    else
    {
        printf("Error 0x%x during CryptGenRandom.\n", GetLastError());
        goto ERR;
    }
 
ERR:
    //-------------------------------------------------------------------
    // 컨텍스트 핸들을 해제합니다.
    if(hCryptProv)
    {
        if (!CryptReleaseContext(hCryptProv, 0))
        {
            printf("Failed CryptReleaseContext\n");
        }
    }
 
    return 0;
}
cs



CryptGetRandom() 함수는 현재 deprecated 되었다.

Cryptography Next Generation APIs를 사용해라.


+ Recent posts