首页 > 解决方案 > 可以在多线程中调用 RtlGenRandom (SystemFunction036) 检索重复字节吗?

问题描述

我将在多线程应用程序中生成 RSA 密钥。我使用 RtlGenRandom 作为 RNG。

我知道我可以在挂起/崩溃或错误的情况下调用多线程。

我的问题是:

可以在多个线程中调用 RtlGenRandom 给我每个线程上的重复字节吗?

请不要提醒我使用 CNG 或 cryptgenrandom,因为这个答案说它们都以bcryptPrimitives!AesRNG*.

标签: winapirandomcryptographythread-safety

解决方案


只有微软可以肯定地告诉你,或者该功能背后的合同到底是什么,但微软基本上说你应该远离这个功能

RtlGenRandom 函数可用于要求部分中指定的操作系统。在后续版本中可能会更改或不可用。相反,使用 CryptGenRandom 函数

不管怎样,拆开它,你会发现

ProcessPrng -> AesRNGState_generate -> SymCryptRngAesGenerate

函数调用链,沿途还有EnterCriticalSection调用,所以我“想象”它是线程安全的。

PS:最后一个SymCryptRngAesGenerate功能是开源的。

另请参阅此crypto/rand:Currently using deprecated API for random number generation on Windows github 关于该主题的讨论。


推荐阅读