For those in a hurry, this is NOT related to the controversial Dual_EC_DRBG
planted inside NIST's SP800-90A.
About the two RNGs:
The Microsoft BCRYPT layer based one is over their C API.
BCryptGenRandom
is following NIST SP800-90A'sCTR_DRBG
(i.e. uses an approved block cipher, AES, to create random bits). However it is unclear if it uses a hardware random source as seed (or part of the seed)...The Microsoft .NET
RNGCryptoServiceProvider
is C# based. Looking at the .NET source code (or here), I see it end up calling the C++ methodCapiNative.GenerateRandomBytes()
. There should have been a P/Invoke stub for the C#=>C++ transition but I couldn't find it anywhere in the framework source. So I have no idea how it's actually implemented.
Does anyone have additional information on these two random number generators? Do either/both use HW random seeds (either via diode noise in older intels or the controversial RDRAND
in the latest intels).
PS: Not sure it this should be at Security, StackOverflow or Cryptography ...