Linux下的真随机数发生器 产生真随机数
在翻阅Linux内核方面的书时发现了一个获取真随机数的方法。
linux内核将机器的物理硬件产生的噪声等(例如发生的键盘敲击,中断次数,频率,温度等等)放入系统的熵池/dev/random 和/dev/urandom 中放的就是熵池中的部分随机数据,/dev/random 里只放入熵池中达到一定熵值的情况,例如达到比较的高的熵值的情况,那个时候数据最混乱,所以读取/dev/random 中的随机数据时会阻塞(熵池中随机性也就是整体熵值达到一定程度才会在这里面有随机数据),但他的随机性能比/dev/urandom 更好点,/dev/urandom 已经可以满足对加密要求非常高需要随机数的场景了。
[root@test59 ~]# vi random.c
#include <stdio.h>
int main( int argc, char** args )
{
unsigned long* seed = malloc( sizeof( unsigned long ) );
FILE* file = fopen("/dev/random", "r");
printf( "%d\n", sizeof( unsigned long ) );
int i;
for( i = 0; i < 9999; ++i)
{
fread( seed, 1, sizeof( unsigned long ), file );
printf( "%lld\n", *seed );
}
return 1;
}
[root@test59 ~]# gcc random.c
[root@test59 ~]# ./a.out
4
19941251665
19270289895
17908196899
19952896273
19796292007
20353450353
21115463529
20863995845
18673226572
18264664191
20194203122
17676988606
18187335585
17527617129
18539147318
17684736786
19253561163
17469991849