gpt4 book ai didi

c++ - CryptGenRandom 在循环调用时给出相同的值

转载 作者:行者123 更新时间:2023-11-30 18:32:06 24 4
gpt4 key购买 nike

抱歉,我不能为此使用单独的类,我尝试构建以下代码并在循环中从外部调用时获得相同的输出。

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

最佳答案

强制转换(reinterpret_castreturn 语句中的强制转换)的使用隐藏了一些重要的编译器错误,这些错误本来可以让您在第一名。

尽可能避免强制转换,而是修复类型。

CryptGenRandom 需要一个

BYTE *pbBuffer

参数。向其传递一个指向 BYTE 数组的指针,不是其他任何东西(您正在传递一个指向 int 数组的指针)。

在返回语句中,您将地址转换为unsigned int。您需要获取 BYTE 数组并将其包含的转换为 int(您可以在网上找到相关示例,也可以通过轮类和添加自己制作一个) 。您现在所做的可能是一遍又一遍地输出相同的地址(或其一部分)。

为了澄清,将数组定义为

BYTE pbBuffer[dwLength] = {};

并将您的函数调用为

::CryptGenRandom(hProvider, dwLength, pbBuffer)

避免强制转换,尤其是 C 风格强制转换,并阅读有关数组的内容。在 C++ 中,当传递给函数时,数组将衰减为指向数组第一个元素的指针。如果您有一个 BYTE 数组,它将衰减为 BYTE*,即函数的预期类型。

关于c++ - CryptGenRandom 在循环调用时给出相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16911134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com