-1

申し訳ありませんが、これに別のクラスを使用することはできません。次のコードを作成して、ループの外側から呼び出したときに同じ出力を得ようとしました。

unsigned int crypt_rand()
{
    HCRYPTPROV hProvider = 0;
    const DWORD dwLength = sizeof(unsigned int);
    unsigned int pbBuffer[dwLength] = {};

    if (!::CryptAcquireContext(&hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
        return 1;
    if (!::CryptGenRandom(hProvider, sizeof(unsigned int), reinterpret_cast<PBYTE>(&pbBuffer)))
    {
        ::CryptReleaseContext(hProvider, 0);
        return 1;
    }
    if (!::CryptReleaseContext(hProvider, 0))
        return 1;
    return (unsigned int)pbBuffer;

}                                      

毎回同じ出力を取得するループからこの関数を呼び出している場合、このメソッドで時間として入力のように与えることができるものはありますか?

for (DWORD i = 0; i < 5; ++i)
    {
        rand_no = crypt_rand();
        std::cout << "windows::"<<i<<"::"<<rand_no<< std::endl;
    }

出力は

windows::0::4519964
windows::1::4519964
windows::2::4519964
windows::3::4519964
windows::4::4519964
4

3 に答える 3

0

unsigned int の乱数が必要ですか? BYTE バッファーの内容を unsigned int にキャストするだけです。

どうですか:

unsigned int crypt_rand()
{
    HCRYPTPROV hProvider = 0;
    const DWORD dwLength = sizeof(unsigned int);
    BYTE buffer[dwLength];

    if (!::CryptAcquireContext(&hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
        return 1;
    if (!::CryptGenRandom(hProvider, sizeof(buffer), &buffer))
    {
        ::CryptReleaseContext(hProvider, 0);
        return 1;
    }
    if (!::CryptReleaseContext(hProvider, 0))
        return 1;
    return *(unsigned int*)buffer;
}
于 2013-09-09T13:12:31.967 に答える
0

ここでの問題は、return (unsigned int)pbBuffer;毎回 pbBUffer のアドレスを取得しているだけです.pbBuffer が配列で、関数 crypt_rand が unsigned int を返す場合、返される配列の要素である必要があります。

コンパイル中に警告を有効にする必要があります。これらの種類の考えられるエラーは、警告として存在する必要があります。

于 2013-06-04T06:39:59.307 に答える