linux下的c语言的随机数算法代码
来源:互联网 发布:wifi路由器破解软件 编辑:程序博客网 时间:2024/05/22 06:38
但是如果我们的种子算法被知道了,那么显然就不行了。当然作为某些应用也无所谓,比如我们要在屏幕上随机的画一只小猪。这样的应用几乎不会有谁会去关心下一次会是什么结果。不过有些应用就不一样了,大的不说,就是一些游戏,也得考虑随机数的安全性问题。
简单的办法是,我们的种子也用随机数来表示。不过这样一来,似乎就有鸡生蛋还是蛋生鸡的问题。好在linux给我们提供了“真正的”随机数,在内核中,linux会维护一些偶然出现的数据,并且为用户提供访问接口。之所以称之为真正的随机数,是因为这些数据来源于计算机本身的偶然操作,比如硬盘操作、键盘和鼠标的操作,等等,这些操作比起那些通过固定算法生成的伪随机数来说,当然是更真实一些了,在这里我们有一个很酷的名字叫做“熵”。内核提供的接口是/dev/random和/dev/urandom设备,二者的区别是读取时random肯定会返回一个数,如果没有足够的数据,就会阻塞。而urandom则不会阻塞,但是不保证返回的是合适的数据。
下面的代码中,函数init_random用来生成一个随机的种子,之后直接调rand就可以得到随机数。之所以读了512次,然后全部组合在一起,就是因为urandom设备不保证每一次读到的都是真实的数据。
另一个函数my_rand则是通过直接去读random设备来得到真实的随机数。这样每一次都是真正的随机数,但是问题在于如果系统的“熵”不够,那么程序就会阻塞。对于安全性要求比较高的应用来说,可以使用这样的方式。如果“熵”不够,可以人为的去“制造”一些熵。比如下面的程序,如果你不做任何操作,也许输出几个随机数之后程序就会停止输出,这是你在另一个终端运行一些比较繁忙的进程,比如"find /",就会发现我们的程序又开始源源不断的输出随机数。
使用random设备的例子很多,比如gpg就会在生成key的时候让你不断的敲键盘直到它满意为止。对于2.4以后的内核,你还可以通过proc文件系统的接口得到random设备的更多信息,比如 /proc/sys/kernel/random/entropy_avail可以知道系统中还有多少“熵”可以用。运行我们的例子可以发现,这个值一下子就减少到个位数,直到程序阻塞。另外一个文件也很有意思,那就是/proc/sys/kernel/random/uuid,通过这个接口可以很容易的得到真正唯一的uuid.
关于random设备还有一些可说的,那就是系统安全。有人居然能通过系统启动过程或者系统运行的某段时间产生的熵的内容来破译出某些信息,这听起来相当高深,不过理论上来讲却完全可能。因为random设备虽然是通过系统噪声来得到熵,但是如果两次系统启动完全一致,那么启动过程中生成的熵当然会完全一致。不过这些安全漏洞不用我们担心,因为现在的系统都有相关的补丁。
#include <stdio.h> #include <sys/time.h> #include <fcntl.h> void init_random () { unsigned int ticks; struct timeval tv; int fd; gettimeofday (&tv, NULL); ticks = tv.tv_sec + tv.tv_usec; fd = open ("/dev/urandom", O_RDONLY); if (fd > 0) { unsigned int r; int i; for (i = 0; i < 512; i++) { read (fd, &r, sizeof (r)); ticks += r; } close (fd); } srand (ticks); printf("init finished "); } unsigned int new_rand () { int fd; unsigned int n = 0; fd = open ("/dev/urandom", O_RDONLY); if (fd > 0) { read (fd, &n, sizeof (n)); } close (fd); return n; } int main () { int n, i; init_random (); n = rand (); printf ("n=%d ", n); for(i=0;i<10;i++) printf ("%u ", new_rand()); }
- linux下的c语言的随机数算法代码
- linux下的c语言的随机数算法代码
- C语言的随机数
- c语言实现的两种获取随机数的算法
- linux下的随机数
- VC下的C语言程序随机数的产生
- linux下发送email的c语言代码
- [编程代码]一个linux下的gcc/c语言makefile
- linux下发送email的c语言代码
- C语言rand()获取随机数和windows下的CryptGenRandom
- linux下归并排序(MergeSort)算法的C语言实现
- C语言随机数的产生
- C语言随机数的总结
- C语言随机数的产生
- C语言随机数的实现
- C语言随机数的使用
- C语言随机数的产生
- C语言的伪随机数
- opengl练习之绘制连续的折线
- 配置环境变量,DOS命令编译和运行JAVA文件
- Linux platform驱动模型分析
- jvm
- Debian设置root登录&root主动登录
- linux下的c语言的随机数算法代码
- 《天地英雄》下载
- Linq 集合处理(Union)
- Period Close Sequence
- opengl练习之绘制任意大小的矩形
- 单元测试UI界面的实现
- java poi excel操作示例
- Hibernate4.1.4使用JPA规范
- Linux进程基础知识