不加任何参数, 即直接rng()
用0作为种子, 即rng(0)
rng('default')
以上三种是等价的。 即用rng产生随机数种子,默认是用0作为种子参数。
另外,任何的正数都可以作为种子参数, 如rng(1),就可以生成与rng(0)不同的随机数种子
也可以把生成的种子作为参数输入, 如rng(rng(0))。
这里我们只需要记住最简单的用法, 当seed相同时,产生的随机数序列是相同的, 也就可以实现我们要固定随机数的目的。
随机数是一种无规律的数,但是真正做到完全无规律也较困难,所以一般将它称之为伪随机数。随机数在密码学用的很多,比如SSL握手中的客户端hello和服务端hello消息中都有随机数;SSL握手中的预主密钥是随机数;RSA密钥生成也用到随机数。如果随机数有问题,会带来很大的安全隐患。软件生成随机数一般预先设置随机数种子,再生成随机数。设置随机数种子可以说是对生成随机数过程的一种扰乱,让产生的随机数更加无规律可循。生成随机数有多种方法,可以是某种算法也可以根据某种或多种随机事件来生成。比如,鼠标的位置、系统的当前时间、本进程/线程相关信息以及机器噪声等。安全性高的应用一般都采用硬件方式(随机数发生器)来生成随机数。
本文假设你已经安装好了OpenSSL,并且持有一份1.1.1的源码。
随机数相关的头文件为rand.h、源文件在crypto/rand目录中。
这个结构定义了涉及随机数生成的抽象方法集合。主要字段含义:
seed —— 随机数种子函数。
bytes —— 随机数生成函数。
cleanup —— 状态清除函数。
add —— 随机数种子添加函数。
pseudorand —— 可重现的随机数函数。
status —— 状态查询函数。
在1.1.1中,大多数的数据结构已经不再向使用者开放,从封装的角度来看,这是更合理的。如果你在头文件中找不到结构定义,不妨去源码中搜一搜。
int RAND_set_rand_method(const RAND_METHOD *meth)
设置自定义的随机数抽象方法。
成功返回1,失败返回0。
const RAND_METHOD *RAND_get_rand_method(void)
获取当前的随机数抽象方法集合。
成功返回有效指针,失败返回NULL。
在我们未调用RAND_set_rand_method()的情况下,该函数返回默认的抽象方法集合。
RAND_METHOD *RAND_OpenSSL(void)
这个函数返回OpenSSL内置的随机数,通常为RAND_DRBG随机数。
void RAND_seed(const void *buf, int num)
种子函数,为了让openssl内部维护的随机数据更加无序,可使用本函数。buf为用户输入的随机数地址,num为其字节数。Openssl将用户提供的buf中的随机内容与其内部随机数据进行摘要计算,更新其内部随机数据。
void RAND_add(const void *buf, int num, double randomness)
与seed类似,也是为了让openssl内部随机数据更加无序,其中entropy(信息熵)可以看作用户本次加入的随机数的个数。从内部实现来看,RAND_seed()相当于调用RAND_add(buf, num, num),此时传递的entropy(信息熵)和缓冲区长度是一样的。至于num和randomness这两个参数如何设置,建议randomness不要超过num的长度,最好是两者相同,或者直接调用RAND_seed(),尽量避免RAND_add()的调用。
int RAND_bytes(unsigned char *buf, int num)
生成随机数,openssl根据内部维护的随机数状态来生成结果。buf用于存放生成的随机数。num为输入参数,用来指明生成随机数的字节长度。
成功返回1,失败返回0。
int RAND_status(void)
查看熵值是否达到预定值,如果达到则返回1,否则返回0。
在openssl实现的md_rand中该函数会调用RAND_poll函数来使熵值合格。如果本函数返回0,则说明此时用户不应生成随机数,需要调用seed和add函数来添加熵值。
从1.1.1版本的使用情况来看,不需要调用RAND_seed(),RAND_status()总是返回成功的,但是建议使用者从安全考虑,虽然不需要理会RAND_status(),请在调用RAND_bytes()之前,总是使用RAND_seed()先初使化随机种子。
const char *RAND_file_name(char *file, size_t num)
指定file缓冲区和num长度,生成随机的文件路径,如果num设置太小不足以容纳完整路径,则返回NULL,建议file缓冲区通常指定256字节。
int RAND_load_file(const char *file, long max_bytes)
将file指定的随机数文件中的数据读取bytes字节(如果bytes大于1024,则读取1024字节),内部调用RAND_add进行计算,生成内部随机数。
成功返回加载的字节数(0表示文件为空),失败返回-1。
int RAND_write_file(const char *file)
生成一个随机数文件,返回生成的内容大小,通常为1024字节。
这个例子演示了随机数的相关API *** 作。
输出:
before RAND_seed() RAND_status() ret:[1]
RAND_status() ret:[1]
RAND_bytes() ret:[1]
04196aa58505fdeef8c5bf9ef9d22e07a3d6859c
p:[0x7ffd028a9070 - /home/test/.rnd] sFile:[0x7ffd028a9070 - /home/test/.rnd]
byteswrite:[1024]
bytesread:[512]
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)