CryptGenRandom
CryptGenRandom is a random number generator function that is included in Microsoft's Cryptographic Application Programming Interface. Microsoft recommends its use in all software where security is an issue.
Method of operation
All Microsoft-provided cryptography providers share the same implementation of CryptGenRandom, currently based on an internal function called RtlGenRandom. [1]. Only a general outline of the algorithm has been published as of 2006:
[RtlGenRandom] generates as specified in FIPS 186-2 appendix 3.1 with SHA-1 as the G function. And with entropy from:
[omitted: long lists of low-level system information fields and performance counters]
- The current process ID (GetCurrentProcessID).
- The current thread ID (GetCurrentThreadID).
- The tick count since boot time (GetTickCount).
- The current time (GetLocalTime).
- Various high-precision performance counters (QueryPerformanceCounter).
- An MD4 hash of the user's environment block, which includes username, computer name, and search path. [...]
- High-precision internal CPU counters, such as RDTSC, RDMSR, RDPMC
Source: Writing Secure Code, Second Edition. ISBN 0-7356-1722-8.
The exact algorithm has not been published, thus it is impossible for independent researchers to peer-review it and evaluate its effectiveness. Theoretical weaknesses include the use of outdated algorithms (such as MD4), and the reliance for entropy gathering on several monotonically-increasing counters that might be estimated or controlled to an extent by an attacker with local access to the machine.
See also
External links
- Microsoft documentation for CryptGenRandom
- Cryptographically Secure Random number on Windows without using CryptoAPI
=========================================================================================
MSDN : http://msdn2.microsoft.com/en-us/library/aa379942.aspx
CryptGenRandom(HCRYPTPROV,DWORD,BYTE) function [Security]
The CryptGenRandom function fills a buffer with cryptographically random bytes.
BOOL WINAPI CryptGenRandom( HCRYPTPROV hProv, DWORD dwLen, BYTE* pbBuffer );
Parameters
hProv
[in] Handle of a cryptographic service provider (CSP) created by a call to CryptAcquireContext.
dwLen
[in] Number of bytes of random data to be generated.
pbBuffer
[in, out] Buffer to receive the returned data. This buffer must be at least dwLen bytes in length.
Optionally, the application can fill this buffer with data to use as an auxiliary random seed.
Return Value
If the function succeeds, the return value is nonzero (TRUE).
If the function fails, the return value is zero (FALSE). For extended error information, call GetLastError.
The error codes prefaced by "NTE" are generated by the particular CSP being used. Some possible error codes are listed in the following table.
Return code |
Description |
ERROR_INVALID_HANDLE |
One of the parameters specifies a handle that is not valid. |
ERROR_INVALID_PARAMETER |
One of the parameters contains a value that is not valid. This is most often a pointer that is not valid. |
NTE_BAD_UID |
The hProv parameter does not contain a valid context handle. |
NTE_FAIL |
The function failed in some unexpected way. |
Remarks
The data produced by this function is cryptographically random. It is far more random than the data generated by the typical random number generator such as the one shipped with your C compiler.
This function is often used to generate random initialization vectors and salt values.
Software random number generators work in fundamentally the same way. They start with a random number, known as the seed, and then use an algorithm to generate a pseudo-random sequence of bits based on it. The most difficult part of this process is to get a seed that is truly random. This is usually based on user input latency, or the jitter from one or more hardware components.
With Microsoft CSPs, CryptGenRandom uses the same random number generator used by other security components. This allows numerous processes to contribute to a system-wide seed. CryptoAPI stores an intermediate random seed with every user. To form the seed for the random number generator, a calling application supplies bits it might have—for instance, mouse or keyboard timing input—that are then added to both the stored seed and various system data and user data such as the process ID and thread ID, the system clock, the system time, the system counter, memory status, free disk clusters, the hashed user environment block. This result is SHA-1 hashed, and the output is used to seed an RC4 stream, which is then used as the random stream and used to update the stored seed. If an application has access to a good random source, it can fill the pbBuffer buffer with some random data before calling CryptGenRandom. The CSP then uses this data to further randomize its internal seed. It is acceptable to omit the step of initializing the pbBuffer buffer before calling CryptGenRandom.
Example Code [C++]
The following example shows the generation of 8 random bytes. These can be used to create cryptographic keys or for any application that uses random numbers. For an example that includes the complete context for this example, see Example C Program: Duplicating a Session Key.
//-------------------------------------------------------------------- // 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);
}
Requirements
Client |
Requires Windows Vista, Windows XP, Windows Me, Windows 2000 Professional, Windows 98, Windows NT Workstation 4.0, or Windows 95 OSR2 and later. |
Server |
Requires Windows Server "Longhorn", Windows Server 2003, Windows 2000 Server, or Windows NT Server 4.0. |
Redistributable |
Requires Internet Explorer 3.02 or later on Windows 95. |
Header |
Declared in Wincrypt.h. |
Library |
Use Advapi32.lib. |
DLL |
Requires Advapi32.dll. |
See Also
Key Generation and Exchange Functions
CryptAcquireContext
CryptGenKey
CryptSetKeyParam
'Development > C/C++' 카테고리의 다른 글
Windows System Error Codes (0) | 2011.08.13 |
---|---|
Windows 서비스 응용 프로그램 MSDN (0) | 2011.08.13 |
VS2008 클래스 디자이너에서 Visual C++ 코드 사용 (0) | 2011.08.13 |
VS2005 Runtime Library, manifest 관련 간단 Tip (0) | 2011.08.13 |
VS2005 유니코드 (0) | 2011.08.13 |