暗号攻撃を回避するために CryptGenRandom() 呼び出しを使用して乱数を作成しようとしました。rand 呼び出しと CryptGenRandom() 呼び出しの両方を出力する次のコードを実行しようとしました。
HCRYPTPROV hProvider = 0;
const DWORD dwLength = 5;
BYTE pbBuffer[dwLength] = {};
if (!::CryptAcquireContext(&hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT|CRYPT_SILENT))
return 1;
srand((unsigned)time (0));
for(int i=0; i<10; ++i)
cout<<"rand()::"<<i<<":"<<rand()<<endl;
for (DWORD i = 0; i < dwLength; ++i)
{
if (!::CryptGenRandom(hProvider, dwLength, pbBuffer))
{
::CryptReleaseContext(hProvider, 0);
return 1;
}
std::cout << "windows::"<<i<<"::"<<static_cast<unsigned int>(pbBuffer[0])<< std::endl;
}
if (!::CryptReleaseContext(hProvider, 0))
return 1;
rand()
しかし、このコールの取得の出力は
rand()::0:9754
rand()::1:526
rand()::2:29162
rand()::3:10461
rand()::4:31585
rand()::5:15594
rand()::6:12157
rand()::7:19178
rand()::8:5413
rand()::9:16157
とCryptGenRandom()
呼び出しが与えています
windows::0::167
windows::1::138
windows::2::197
windows::3::101
windows::4::44
CryptGenRandom を使用して rand() 呼び出しを行っているのと同じ出力を得るのを手伝ってくれる人はいますか? CryptGenRandom() は、コードで使用しているスリープ コールの値を設定するには不十分な 3 桁の乱数しか与えていません。