Openssl 随机数生成

Openssl中生成随机数的函数,定义在rand.h 文件中。

最直接的用法是调用函数:

int  RAND_bytes(unsigned char *buf,int num);

根据加密算法生成随机数,其实也是一个伪随机数,但是,如果在调用此函数之前,设定好随机种子,那么生成的随机数是不能被预先计算出来的。

buf:输出,生产的随机数存储的数组;

num: 输入,生产的随机数个数;

返回值:1 ,成功, 0 失败;


Openssl还提供另外一个随机数生成函数,int RAND_pseudo_bytes(unsigned char *buf, int num); 从函数名称中可以看出,这个生成的是伪随机数,生成的随机数可以预先计算出来。对于数据对随机性要求不高的,可以调用此函数。


void RAND_seed(const void *buf,int num);

随机数生成前设定种子;

buf: 输入, 种子保存的数组;

num: 输入,种子数据长度;


//tbd

void RAND_add(const void *buf,int num,double entropy);

增加随机数生成的不可预知性,将buf数组中num个数据加入PRNG中,entropy是对buf中数据的随机性估计值,如果entropy 和num相等,那么RAND_add函数与Rand_seed函数相同;

buf中的数据,一般采用系统中随机性的事件,比如一些交互性数据,用户敲击的键盘值,鼠标滑过的位置等等。


int RAND_Status();

返回值,如果随机数种子已经满足条件,返回1 ,否则返回0;

int RAND_event(UINT, WPARAM, LPARAM);

RAND_event是为Windows系统设计的函数,手机用户的一些交互性数据,比如鼠标的移动等等;

iMsg, RParam, LParam 这三个参数是Windows在传递消息时所带的三个参数,此函数会评估传递参数的随机性,然后根据判定结果,决定是否加入到PRNG中;

返回值,如果随机数种子已经满足条件,返回1 ,否则返回0;




void RAND_screen(void);

RAND_screen也是为Windows系统设计的函数,将当前屏幕数据加入到PRNG中,在windows系统中,对于应用开发者,最好采用RAND_event函数来收集硬件事件,增加PRNG的随机性,需要注意的是,这两个函数,不能在没有交互性的系统比如服务器中使用。


 const char *RAND_file_name(char *buf, size_t num);
在默认路径下,生成随机数种子文件,
buf: 保存文件名
num: 文件名字符数;
如果$RANDFILE设定,文件名即为$RANDFILE,如果没有设定,那么文件名是$HOME/.rnd
如果$HOME或者num的数字太小,不能容纳文件名,那么函数将返回错误。
返回值,如果成功,返回buf的地址,如果失败,NULL

 int RAND_load_file(const char *filename, long max_bytes);
从随机数种子文件中读取数据,加入到PRNG中;
filename: 随机数种子文件;
max_bytes:可以读取的最大字节数;如果max_bytes 的值是-1,将读取整个文件;
返回值: 读取的数据个数;


 int RAND_write_file(const char *filename);

将随机数写入种子文件,当前是1024个字节,使用者后面可以调用RAND_load_file读取这些随机数;

返回值: 写入的字节数,如果失败,则写入-1;


void RAND_cleanup(void);
清除PRNG的状态;


 int RAND_egd(const char *path);
向取随机数种子的Dameon程序EGD要求种子数据,数据长度为255个字节;
path: EGD的socket路径;
返回值:读取的数据字节数,如果失败,返回-1

 int RAND_egd_bytes(const char *path, int bytes)
向取随机数种子的Dameon程序EGD要求种子数据,数据长度为bytes定义的字节数;
path: EGD的socket路径;
bytes:请求的字节数;
返回值:读取的数据字节数,如果失败,返回-1
 
 int RAND_query_egd_bytes(const char *path, unsigned char *buf, int bytes);
向取随机数种子的Dameon程序EGD要求种子数据,数据长度为bytes定义的字节数,如果buf不是空,那么数据保存在buf定义的内存中,否则直接加到PRNG中;
path: EGD的socket路径;
bytes:请求的字节数;
返回值:读取的数据字节数,如果失败,返回-1

关于EGD://tbc
系统中如果没有/dev/*random服务,可以通过edg Deamon服务来实现对随机数种子的获取,edg通过socket界面来通信,一次最多可以获取255个字节,一次连接可以获取多次数据;


 



  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenSSL提供了不同的随机数生成函数,其中包括RAND_pseudo_bytes函数,用于生成伪随机数。这些生成的随机数可以预先计算出来。对于对随机性要求不高的数据,可以使用此函数。不同版本的OpenSSL使用不同的随机数发生器。在非FIPS版本中,默认使用OpenSSL内部集成的一种基于HASH算法(默认为SHA1)的随机数发生器,而熵源则根据不同的系统有不同的生成方式。而在FIPS版本中,OpenSSL使用NIST SP 800-90A的三种随机数发生器,熵源由调用者通过回调函数的方式从外部提供。具体关于OpenSSL FIPS 2.0.11使用的NIST SP 800-90A的三种随机数发生器的详细信息可以参考《NIST SP 800-90系列(随机数发生器)笔记》。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Openssl 随机数生成](https://blog.csdn.net/Sunspider107/article/details/7364770)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [OpenSSL v0.9.8a随机数发生器分析(合集)](https://blog.csdn.net/samsho2/article/details/83510753)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值