我发誓,每次检查MSDN文档时,这似乎都在改变。当我编写可执行文件时,Microsoft建议使用RtlGenRandom API生成加密强大的随机数。
现在,当我查看RtlGenRandom的文档时,其中的注释建议使用CryptGenRandom代替。但是CryptGenRandom的另一个注释说明了这一点:
重要提示:不推荐使用此API。新的和现有的软件应该 开始使用Cryptography Next Generation APIs。微软可能删除 在将来的版本中使用此API。
有人可以在C中展示如何使用这些" Cryptography Next Generation API "生成Microsoft建议的随机数字节数组?
答案 0 :(得分:4)
这并不重要,在Windows XP及更高版本中,默认提供程序最终会调用相同的函数。 2000年的RNG和未修补的XP主要在内部使用SHA1 + RC4,它有一些security issues。
我刚刚在Windows 8上做了一些实验,这就是我发现的:
RtlGenRandom
(AKA advapi32!SystemFunction036
)致电CRYPTBASE!SystemFunction036
>>> bcryptPrimitives!ProcessPrng
>>> bcryptPrimitives!AesRNG*
。CryptGenRandom
来电CRYPTSP!CryptGenRandom
>>> %provider%!CPGenRandom
>>> CRYPTBASE!SystemFunction036
。 %provider%
在我的测试中是rsaenh或dssenh,但如果您特别要求第三方提供商,则可能是不同的实现。BCryptGenRandom
来电bcryptPrimitives!MSCryptGenRandom
>>> bcryptPrimitives!GenRandomAes
>>>具有bcryptPrimitives!AesRNG*
CNG算法标识符的BCRYPT_RNG_ALGORITHM
BCRYPT_RNG_DUAL_EC_ALGORITHM
最终会以bcryptPrimitives!GenRandomDualEcc
结尾。 这当然是无证的实施细节,可能会改变,但我真的不认为你需要担心你选择哪种功能。如果你的目标是Vista +,你可以使用BCrypt。永远不会删除CryptGenRandom
,它会破坏太多的应用程序,如果你支持< Vista中。