RtlGenRandom / CryptGenRandom或其他WinAPI生成加密安全随机数(2018年第一季度)

时间:2018-02-19 23:54:21

标签: c winapi encryption random cryptography

我发誓,每次检查MSDN文档时,这似乎都在改变。当我编写可执行文件时,Microsoft建议使用RtlGenRandom API生成加密强大的随机数。

现在,当我查看RtlGenRandom的文档时,其中的注释建议使用CryptGenRandom代替。但是CryptGenRandom的另一个注释说明了这一点:

  

重要提示:不推荐使用此API。新的和现有的软件应该   开始使用Cryptography Next Generation APIs。微软可能删除   在将来的版本中使用此API。

有人可以在C中展示如何使用这些" Cryptography Next Generation API "生成Microsoft建议的随机数字节数组?

1 个答案:

答案 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中。