4

对于那些赶时间的人来说,这与NIST 的 SP800-90A 内有争议的种植无关Dual_EC_DRBG

关于两个RNG:

  1. 基于 Microsoft BCRYPT 层的是他们的 C API。BCryptGenRandom遵循 NIST SP800-90A CTR_DRBG(即使用经批准的分组密码 AES 来创建随机位)。但是,尚不清楚它是否使用硬件随机源作为种子(或种子的一部分)......

  2. Microsoft .NETRNGCryptoServiceProvider基于 C#。查看.NET 源代码(或此处),我发现它最终调用了 C++ 方法CapiNative.GenerateRandomBytes()。C#=>C++ 转换应该有一个 P/Invoke 存根,但我在框架源代码中的任何地方都找不到它。所以我不知道它是如何实际实施的。

有没有人有关于这两个随机数生成器的额外信息?是否/两者都使用硬件随机种子(通过旧英特尔中的二极管噪声或RDRAND最新英特尔中的争议)。

PS:不确定这应该在 Security、StackOverflow 或 Cryptography ...

4

2 回答 2

5

Microsoft .NET RNGCryptoServiceProvider 是基于 C#

不完全是,托管框架类只是 Windows 中内置的 Crypto api 的一个薄包装器。所有名称以结尾的 System.Security.Cryptography 类ServiceProvider都是本机 API 的包装器。那些Managed以纯托管代码结尾的名称。因此,这些XxxServiceProvider类使用 FIPS 验证的密码学,而这些XxxManaged类不是。

它不完全是 pinvoke,它使用一种通用机制在 CLR 代码中进行直接调用。jitter 查阅带有 C++ 函数地址的表并直接编译 CALL 机器代码指令。此答案中描述了该机制。查看实际代码是不可能的,它不包含在 SSCLI20 发行版中,并且已更改为使用 .NET 4 中的 QCall 机制。

所以这个断言是无法证明的,但很可能 RNGCryptoServiceProvider 和您传递给 BCryptGenRandom() 的算法提供程序使用相同的随机数来源。在 Windows 中,它是 advapi.dll 中的一个未命名的导出函数,这个答案很好地总结了它的用途。

如果这确实让您担心并且您想要一个可靠的信息来源,那么请不要从免费的 Q+A 网站上获取您的安全需求的建议。致电 Microsoft 支持。

于 2013-10-05T20:25:12.290 回答
2

RFC 4086RNGCryptoServiceProvider中提到了Microsoft :

7.1.3. Windows CryptGenRandom

Microsoft 对广泛部署的 Windows 操作系统的用户的建议通常是使用 CryptGenRandom 伪随机数生成调用与 CryptAPI 加密服务提供商。这需要一个密码服务提供者库的句柄,一个指向缓冲区的指针,调用者可以通过该缓冲区提供熵并将生成的伪随机性返回到该缓冲区中,并指示需要多少个八位字节的随机性。

Windows CryptAPI 加密服务提供程序为每个用户存储一个种子状态变量。当调用 CryptGenRandom 时,它会与调用中提供的任何随机性以及各种系统和用户数据相结合,例如进程 ID、线程 ID、系统时钟、系统时间、系统计数器、内存状态、空闲磁盘集群和散列用户环境块。这些数据全部馈送到 SHA-1,输出用于播种 RC4 密钥流。该密钥流用于生成请求的伪随机数据并更新用户的种子状态变量。

Windows“.NET”的用户可能会发现使用 RNGCryptoServiceProvider.GetBytes 方法接口更容易。

于 2013-10-06T10:36:28.797 回答