对于那些匆忙的人来说,这是,而不是,它与NIST SP800-90A中有争议的Dual_EC_DRBG
有关。
关于这两件事:
BCryptGenRandom
正在遵循NISTSP800-90A的CTR_DRBG
(即使用已批准的分组密码AES来创建随机比特)。但是,不清楚它是否使用硬件随机源作为种子(或种子的一部分).RNGCryptoServiceProvider
是基于C#的。查看.NET源代码 (或这里),我看到它最终调用了C++方法CapiNative.GenerateRandomBytes()
。C#=>C++转换应该有一个P/Invoke存根,但是我在框架源代码中找不到它。所以我不知道它是如何实现的。有人对这两个随机数发生器有更多的信息吗?做任何一种/两者都使用HW随机种子(通过二极管噪音在较老的英特尔或争议的RDRAND
在最新的英特尔)。
PS:不确定这应该是在安全,StackOverflow或密码.
发布于 2013-10-05 20:25:12
Microsoft .NET RNGCryptoServiceProvider是基于C#的。
不完全是,托管框架类只是内置在Windows中的Crypto的一个薄包装器。名称以ServiceProvider
结尾的所有System.Security.Cryptography类都是本机API的包装器。名称以Managed
结尾的代码是在纯托管代码中实现的。因此,XxxServiceProvider
类使用FIPS验证的加密功能,而XxxManaged
类则不使用。
它并不完全是pinvoke,它使用一种通用机制在CLR代码中进行直接调用。抖动参考具有C++函数地址的表,并直接编译调用机代码指令。该机制在这个答案中进行了描述。看一看实际的代码是不可能的,它没有包含在SSCLI20发行版中,而是被修改为在.NET 4中使用QCall机制。
因此断言是不可证明的,但很可能RNGCryptoServiceProvider和传递给BCryptGenRandom()的算法提供者对随机数使用相同的源。在advapi.dll中,这个答案是一个未命名的导出函数,它很好地总结了它的用途。
如果这真的关系到你和你想要一个可靠的信息来源,那么就不要从一个免费的Q+A网站为你的安全需要听取建议。打电话给微软支持。
发布于 2013-10-06 10:36:28
Microsoft RNGCryptoServiceProvider
在RFC 4086中有提及。
7.1.3.Windows CryptGenRandom 微软向广泛部署的Windows操作系统的用户推荐使用CryptGenRandom伪随机数生成调用和CryptAPI加密服务提供商。这需要一个密码服务提供者库的句柄,一个指向调用方可以提供熵并返回生成的伪随机性的缓冲区的指针,并指示需要多少八位数的随机性。 Windows加密服务提供程序向每个用户存储种子状态变量。当调用CryptGenRandom时,这与调用中提供的任意随机性以及各种系统和用户数据(如进程ID、线程ID、系统时钟、系统时间、系统计数器、内存状态、空闲磁盘集群和散列用户环境块)相结合。这些数据都被输入到SHA-1中,输出被用来为RC4密钥流注入种子。该密钥流用于产生请求的伪随机数据和更新用户的种子状态变量。 Windows ".NET“的用户可能会发现使用RNGCryptoServiceProvider.GetBytes方法界面更容易。
https://stackoverflow.com/questions/19201461
复制相似问题