В общем сделал вот так:
//---------------------------------------------------------------------------
class Win32_CryptContext
{
public:
Win32_CryptContext() { if (!CryptAcquireContext(&Handle, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) throw TMFS_Exception(L"Win32_CryptContext fail"); }
~Win32_CryptContext() { CryptReleaseContext(Handle, 0); }
//
operator HCRYPTPROV() { return Handle; }
private:
HCRYPTPROV Handle;
};
//---------------------------------------------------------------------------
void Win32_Random(UCHAR *buf, ULONG s)
{
Win32_CryptContext h;
//
if (!CryptGenRandom(h, s, buf)) throw TMFS_Exception(L"Win32_Random fail");
}
//---------------------------------------------------------------------------
Оценить насколько это хорошо не могу
Я даже не понимаю что значат флаги у CryptAcquireContext
Описание у функции на msdn не раскрывает используемых алгоритмов
Но наверно лучше чем велосипедить с rand()