【发布时间】:2013-06-03 16:45:40
【问题描述】:
我尝试使用 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 位随机数,不足以设置我在代码中使用的睡眠调用的值。
【问题讨论】:
-
嗯...没有。
CryptGenRandom是一个加密安全的 PRNG。如果你可以让它按需产生一个特定的序列,那将是一个巨大的问题。您认为CryptGenRandom的输出有什么问题? -
它只提供 3 位整数输出 因为您只使用第一个 BYTE。试试
*static_cast<unsigned *>(pbBuffer)并比较... -
我尝试更改 BYTE 但它不起作用。你能帮我使用它吗?
-
是的。正确使用
CryptGenRandom。 -
@Useless:由于对齐,该演员表不安全。
标签: c++ c linux windows visual-c++