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 によって生成されます。 考えられるエラー コードの一部を次の表に示します。
リターン コード | 説明 |
---|---|
|
パラメーターの 1 つは、無効なハンドルを指定します。 |
|
パラメーターの 1 つに無効な値が含まれています。 これは、ほとんどの場合、無効なポインターです。 |
|
hProv パラメーターに有効なコンテキスト ハンドルが含まれていません。 |
|
関数が予期しない方法で失敗しました。 |
注釈
この関数によって生成されるデータは、暗号的にランダムです。 これは、C コンパイラに付属するものなど、一般的な乱数ジェネレーターによって生成されるデータよりもはるかにランダムです。
この関数は、多くの場合、ランダム な初期化ベクトル と ソルト値を生成するために使用されます。
ソフトウェア乱数ジェネレーターは、基本的に同じ方法で動作します。 これらはシードと呼ばれる乱数から始まり、アルゴリズムを使用して、それに基づいてビットの擬似ランダム シーケンスを生成します。 このプロセスの最も困難な部分は、本当にランダムなシードを取得することです。 これは通常、ユーザー入力の待機時間、または 1 つ以上のハードウェア コンポーネントからのジッターに基づいています。
Microsoft CSP では、 CryptGenRandom は他のセキュリティ コンポーネントで使用されるのと同じ乱数ジェネレーターを使用します。 これにより、多数のプロセスがシステム全体のシードに貢献できるようになります。 CryptoAPI は、すべてのユーザーに中間ランダム シードを格納します。 乱数ジェネレーターのシードを形成するために、呼び出し元のアプリケーションは、それが持っている可能性のあるビット (たとえば、マウスやキーボードのタイミング入力) を提供し、格納されているシードとさまざまなシステム データと、プロセス ID やスレッド ID、システム クロック、システム時刻、システム カウンターなどのユーザー データの両方と組み合わせて使用します。 メモリの状態、空きディスク クラスター、ハッシュされたユーザー環境ブロック。 この結果は、擬似乱数ジェネレーター (PRNG) のシード処理に使用されます。 Windows Vista Service Pack 1 (SP1) 以降では、NIST Special Publication 800-90 で指定された AES カウンター モード ベースの PRNG の実装が使用されます。 Windows Vista、Windows Storage Server 2003、および Windows XP では、Federal Information Processing Standard (FIPS) 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 |
Library | Advapi32.lib |
[DLL] | Advapi32.dll |