在VS2010中实现random_device?

Ale*_*ban 13 c++ random visual-studio-2010 c++11

根据我对标准的阅读,random_device::entropy()如果使用软件引擎,则应返回0.0.但是,在VS2010中,它返回32.0,这在我的理解中要求硬件产生非确定性随机数.

VS2010如何random_device生成数字序列?

Mic*_*urr 22

根据Hans Passant在这个问题上留下的评论,random_device使用advapi32:SystemFunction036,根据MSDN的别名RtlGenRandom.这由VC++ 2010提供的运行时库源验证:

random_device::operator()()<random>调用以下函数链:

_Random_device() // in xrngdev.cpp
    rand_s()     // in rand_s.c
        RtlGenRandom()/SystemFunction036()  // in advapi32.dll
Run Code Online (Sandbox Code Playgroud)

根据迈克尔·霍华德在他的一篇博客文章"Windows上使用Cryptographically Secure Random number而不使用CryptoAPI"留下的评论,RtlGenRandom使用以下内容:

RNG按照FIPS 186-2附录3.1的规定生成,SHA-1作为G功能.使用熵来自:

  • 当前进程ID(GetCurrentProcessID).

  • 当前线程ID(GetCurrentThreadID).

  • 自启动后的刻度(GetTickCount).

  • 当前时间(GetLocalTime).

  • 各种高精度性能计数器(QueryPerformanceCounter).

  • 用户环境块的MD4哈希,包括用户名,计算机名和搜索路径.MD4是一种散列算法,可根据输入数据创建128位消息摘要,以验证数据完整性.

  • 高精度内部CPU计数器,例如RDTSC,RDMSR,RDPMC

  • 低级别的系统信息:空闲进程时间,IO读取传输计数,I/O写入传输计数,I/O其他传输计数,I/O读取操作数,I/O写操作数,I/O其他操作计数,可用页面,提交页面,提交限制,峰值承诺,页面错误计数,写入时复制,转换计数,缓存转换计数,需求零计数,页面读取计数,页面读取I/O计数,缓存读取计数,缓存I/O计数,脏页写入计数,脏写入I/O计数,映射页写入计数,映射写入I/O计数,分页池页面,非分页池页面,分页池分配空间,分页池可用空间,非分页池已分配space,Non Paged Pool可用空间,免费系统页表项,Resident System Code Page,Total System Driver Pages,Total System Code Pages,Non Paged Pool Lookaside Hits,Paged Pool Lookaside Hits,Available Paged Pool Pages,Resident System Cache Page,驻留分页池页面,驻留系统驱动程序页面,高速缓存管理器快速读取否 等待,高速缓存管理器快速读取等待,高速缓存管理器快速读取资源丢失,高速缓存管理器快速读取不可能,高速缓存管理器快速存储器描述符列表无等待读取,高速缓存管理器快速存储器描述符列表读取等待,高速缓存管理器快速存储器描述符列表读资源未命中,高速缓存管理器快速存储器描述符列表读取不可能,高速缓存管理器无等待映射数据,高速缓存管理器映射数据等待,高速缓存管理器映射数据无等待丢失,高速缓存管理器映射数据等待未命中,高速缓存管理器引脚映射数据计数,高速缓存管理器品读与不等待,高速缓存管理器引脚读与等待,高速缓存管理器品读与不等待小姐,高速缓存管理器品读等待小姐,高速缓存管理器复制读取没有等待,高速缓存管理器复印通读取等待,高速缓存管理器复制读取无等待丢失,高速缓存管理器复制读取等待未命中,高速缓存管理器内存描述符列表读取无等待,高速缓存管理器内存描述符列表读取等待,高速缓存管理器内存描述符列表重新 没有等待错过的广告,高速缓存管理器内存描述符列表读取等待未命中,高速缓存管理器预读IO,高速缓存管理器懒惰写入IO,高速缓存管理器惰性写入页面,高速缓存管理器数据刷新,高速缓存管理器数据页面,上下文切换,第一级别转换缓冲区填充,二级转换缓冲区填充和系统调用.

  • 系统异常信息包括对齐修正计数,异常调度计数,浮动仿真计数和字节字仿真计数.

  • 系统旁视信息包括当前深度,最大深度,总分配,分配未命中,总免费,免费未命中,类型,标记和大小.

  • 系统中断信息,包括上下文切换,延迟过程调用计数,延迟过程调用率,时间增量,延迟过程调用旁路计数和异步过程调用旁路计数.

  • 系统进程信息,包括下一个条目偏移,线程数,创建时间,用户时间,内核时间,映像名称,基本优先级,唯一进程ID,继承自唯一进程ID,句柄计数,会话ID,页面目录库,峰值虚拟大小,虚拟大小,页面错误计数,峰值工作集大小,工作集大小,配额峰值页面池使用情况,配额分页池使用情况,配额峰值非分页池使用情况,配额非分页池使用情况,页面文件使用情况,峰值页面文件使用情况,专用页数,读操作计数,写操作计数,其他操作计数,读传输计数,写传输计数和其他传输计数.

在编写安全代码第2版的第8章中有完整的解释(包括图表).