什么加密随机生成器C代码可以在WP8.1上使用

What crypto random generator C code could use on WP8.1?

本文关键字:WP8 代码 随机 加密 什么      更新时间:2023-10-16

我已经获取了一些C代码,并在通用应用程序的C++WinRT组件中进行了编译。然后,我根据手册1、2编写了一个C++包装类,将C代码的功能公开给我的C#通用商店项目。

适用于项目的Windows 8.1部分,但无法在Windows Phone 8.1上加载组件,仅表示"The specified module could not be found"。我发现问题是C代码使用了以下随机生成器函数:

# define RtlGenRandom SystemFunction036
# if defined(__cplusplus)
extern "C"
# endif
BOOLEAN NTAPI RtlGenRandom(PVOID RandomBuffer, ULONG RandomBufferLength);
# pragma comment(lib, "advapi32.lib")

这在WP8.1上似乎不可用。

这个MSDN页面建议我们应该使用CryptGenRandom,但后者驻留在Wincrypt.h中,这在WP8.1上不可用。

那么,我们可以使用C代码中的哪个随机生成器呢?

使用WinRT Windows::Security::Cryptography[C++]API。CryptographicBuffer.GenerateRandom将执行所需的

我想要一些不涉及从C调用C++/CX代码的东西,但到目前为止一无所获。所以,下面是我目前使用的解决方案。

// C++/CX
using namespace Platform;
using namespace Windows::Security::Cryptography;
using namespace Windows::Storage::Streams;
extern "C" void GenerateRandomBytes(unsigned char *bytes, unsigned int length)
{
    IBuffer^ buffer = CryptographicBuffer::GenerateRandom(length);
    DataReader^ reader = DataReader::FromBuffer(buffer);
    reader->ReadBytes(ArrayReference<unsigned char>(bytes, buffer->Length));
}
// C
#ifdef RtlGenRandom
RtlGenRandom((PVOID) buf, (ULONG) size);
#else
GenerateRandomBytes((unsigned char*)buf, (unsigned int)size);
#endif