3. 函数说明

默认的随机数发生器的调用函数为(代码见.\crypto\rand\md_rand.c)

  1. ssleay_rand_cleanup             置零
  2. ssleay_rand_status               获取状态信息
  3. ssleay_rand_seed                 添加满熵种子
  4. ssleay_rand_add                  添加信息
  5. ssleay_rand_bytes                产生随机数据
  6. ssleay_rand_pseudo_bytes         产生伪随机数据

熵源(Windows下的代码见.\crypto\rand\rand_win.c)

  1. RAND_poll                            不同版本使用不同的熵源产生方式

3.1 ssleay_rand_cleanup置零

函    数:  void ssleay_rand_cleanup(void)

功能描述:  置零

说    明:  相当于init、uninit、reset

注    意:  无

参数说明:  无

返 回 值:  无

执行步骤:

步骤1:内部状态全部清零/重置。

3.2 ssleay_rand_status状态信息

函    数:  int ssleay_rand_status(void)

功能描述:  获取状态信息

说    明:  无

注    意:  无

参数说明:  无

返 回 值:  当前的熵值entropy是否大于32字节(256比特)

执行步骤:

步骤1:若未初始化(initialized为0),执行采集系统熵信息的函数RAND_poll(),此函数将改变熵值entropy;并将initialized置为1。

步骤2:返回当前的熵值entropy是否大于32字节(256比特)。

3.3 ssleay_rand_seed添加满熵种子

函    数:  void ssleay_rand_seed(const void *buf, int num)

功能描述:  添加满熵种子

说    明:  无

注    意:  这里认为种子是满熵的,所以将种子的熵值也设定为种子长度

参数说明:

buf     (in)     种子

num   (in)     种子的字节长度

返 回 值:  无

执行步骤:

步骤1:直接调用ssleay_rand_add(buf, num, num)函数并返回。

3.4 ssleay_rand_pseudo_bytes产生伪随机数

函    数:  int ssleay_rand_pseudo_bytes(unsigned char *buf, int num)

功能描述:  产生伪随机数

说    明:  无

注    意:  这里简单地设置两个函数ssleay_rand_pseudo_bytes和ssleay_rand_add是一样,其实应有差别。

参数说明:

buf     (out)   伪随机数

num   (in)     需要的伪随机数的字节长度

返 回 值:  1 [成功],0 [失败]

执行步骤:

步骤1:直接调用ssleay_rand_add(buf, num, num)函数并返回。

3.5 ssleay_rand_add添加熵信息

函    数:  void ssleay_rand_add(const void *buf, int num, double add)

功能描述:  添加熵信息

说    明:  更新内部状态;默认的HASH函数为SHA1,输出长度为20字节。

注    意:  添加信息的熵值(add)可为小数。

参数说明:

buf     (in)     添加信息

num   (in)     添加信息的字节长度

add    (in)     添加信息的熵值,单位:字节。

返 回 值:  无

执行步骤:

步骤1:更新state_num(状态的实际有效字节数)

state_num =min(state_num + numSTATE_SIZE)

步骤2:将输入数据buf以及内部状态中的环形缓冲区statestatestate_index起的num字节数据),分别按杂凑函数HASH的输出大小MD_DIGEST_LENGTH分割为n个块(最后一个分块可能为不完整分块):

B0||B1||...||Bn-1=buf

S0||S1||...||Sn-1=state[state_index,..., state_index+num-1]

n=Ceil(num/MD_DIGEST_LENGTH)

步骤3:local_md = md

步骤4:对每个块i = 0,1,2,...,n-1 执行

  1. 4.1 计算杂凑值

local_md = HASH (local_md ||Si||Bi||md_count[0]||md_count[1])

  1. 4.2 更新Si = Silocal_md
  2. 4.3 更新md_count[1] = md_count[1]+1

步骤5:用更新的Sii=0,1,2,...,n-1更新状态state

state[state_index,..., state_index+num-1] = S0||S1||...||Sn-1

步骤6:用最后得到的local_md更新md = mdlocal_md

步骤7:更新熵值:entropy = min(32, entropy + add)。

图中的简写

C0即md_count[0]

C1即md_count[1]

idx即state_index

3.6 ssleay_rand_bytes产生随机数

函    数:  int ssleay_rand_bytes(unsigned char *buf, int num)

功能描述:  产生随机数

说    明:  无

注    意:  添加信息的熵值(add)可为小数。

参数说明:

buf     (in)     添加信息

num   (in)     添加信息的字节长度

add    (in)     添加信息的熵值,单位:字节。

返 回 值:  无

执行步骤:

步骤1:若未初始化(initialized为0),则执行RAND_poll()增加熵值。

步骤2:计算几个基本记号

L2 = MD_DIGEST_LENGTH/2

L1 = MD_DIGEST_LENGTH

n=Ceil(num/ L2 ),

num_ceil = Ceil (num/ L)* L

步骤3:若熵源池未搅拌(本函数内定义的静态变量stirred_pool),则执行m = Ceil(STATE_SIZE/ L1) 次添加熵信息

rand_add("....................",L1, 0.0)。

步骤4:local_md = md

步骤5:将输出数据缓冲区buf以及内部状态中的环形缓冲区statestatestate_index起的num字节数据),分别按L2分割为n=Ceil(num/ L2 )个块(最后一个分块可能为不完整分块):

B0||B1||...||Bn-1=buf

S0||S1||...||Sn-1=state[state_index,..., state_index+num-1]

步骤6:for k = 0,1, 2,...,n-1,执行

  1. 6.1 设置字符串pad:若k为0,则pad = getpid(),否则,pad = NULL为空串。
  2. 6.2 计算杂凑值

local_md = HASH( pad || local_md || md_count[0] || md_count[1] || Bi || Si)

注意:Bi是输出缓冲区,但这里读取了其中的数据

  1. 6.3 更新SiBi

Si = Si ⊕ local_md[0,..., L2-1]

Bi = Bi ⊕ local_md[L2,..., L1-1]

注意:这里没有更新md_count[0]和md_count[1]的步骤。

步骤7:更新md

md = HASH(md_count[0] || md_count[1]|| local_md || md)

步骤8:用更新的Sii=0,1,2,...,n-1更新状态state

state[state_index,..., state_index+num-1] = S0||S1||...||Sn-1

步骤9:更新state_index =( state_index + num_ceil )mod state_num

步骤10:更新md_count[0] = md_count[0]+ 1;

步骤11:输出随机数buf = B0||B1||...||Bn-1

OpenSSL v0.9.8a随机数发生器分析之二——随机数发生器函数说明相关推荐

  1. OpenSSL v0.9.8a随机数发生器分析(合集)

    OpenSSL随机数发生器 本文档对OpenSSL使用的随机数进行研究分析,主要涉及OpenSSL v0.9.8a的随机数发生器以及其在Windows系统下的熵源采集情况. 目录 1. 概况... 1 ...

  2. OpenSSL v0.9.8a随机数发生器分析之三——熵采集

    4. 熵采集 熵采集函数为RAND_poll,它在不同操作系统下使用不同的熵源产生方式,Windows下的代码见.\crypto\rand\rand_win.c. 此外,不同的OpenSSL版本中其熵 ...

  3. 区块链安全—随机数安全分析(上)

    一.前言 "随机数"在计算机程序中并不少见,开发人员也会经常使用随机数进行数值的模拟.预测.在C++程序里,我们经常使用一定的种子来进行随机数的生成过程.在计算机程序中,随机数可以 ...

  4. java生成随机数的方法_Java获取随机数的3种方法

    随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串.数字.或者随即生成一个不定长度的数字.或者进行一个模拟的随机选择等等.Java提供了最基本的工具,可以帮助开发者来实现这一切. 一.Jav ...

  5. Spring Cloud源码分析(二)Ribbon(续)

    因文章长度限制,故分为两篇.上一篇:<Spring Cloud源码分析(二)Ribbon> 负载均衡策略 通过上一篇对Ribbon的源码解读,我们已经对Ribbon实现的负载均衡器以及其中 ...

  6. Spring Cloud源码分析(二)Ribbon

    断断续续看Ribbon的源码差不多也有7-8天了,总算告一段落.本文记录了这些天对源码的阅读过程与一些分析理解,如有不对还请指出. 友情提示:本文较长,请选择一个较为舒适的姿势来阅读 在之前介绍使用R ...

  7. php返回随机数,PHP内置函数生成随机数的方法汇总

    PHP内部生成随机数的方法相比其他方法简单,不需要额外配置,是生成随机数的首选方案. 1 rand函数 rand() 函数可以不加任何参数,就可以生成随机整数.如果要设置随机数范围,可以在函数中设置 ...

  8. R语言使用rnorm函数生成正态分布随机数、自定义指定生成随机数的个数、均值、方差

    R语言使用rnorm函数生成正态分布随机数.自定义指定生成随机数的个数.均值.方差 目录 R语言使用rnorm函数生成正态分布随机数.自定义指定生成随机数的个数.均值.方差 R 语言特点 R语言使用r ...

  9. BUCK电路分析(二)

    BUCK电路分析(二) PSIM仿真同步BUCK电路 ​ 在上片文章中,初步的分析了BUCK电路的工作原理.本章使用PSIM软件仿真BUCK电路,观察分析BUCK电路器件关键波形.图1是同步BUCK电 ...

最新文章

  1. 【C++】函数 指针类型参数 与 引用类型参数 对比 ( 修改外部变量需要传入的参数要求 | 参数作返回值 )
  2. 昨天还在for循环里写加号拼接字符串的那个同事,今天已经不在了
  3. 【云炬大学生创业基础笔记】第1章第1节 创新和创业有什么样的关系?
  4. 从文件中读取数据,排序之后输出到另一个文件中
  5. python try语句相关(try/except/else/finally)
  6. 扁平图文列表小程序模板
  7. CSS——CSS创建样式表
  8. Nginx服务状态监控
  9. 用sc命令查询系统状态
  10. qtcreator下拉列表怎么制作_如何用WPS制作月度记账表
  11. Windows NAS迁移工具
  12. feature tools:Python 中的自动化特征工程
  13. vue3移动端腾讯地图坐标拾取,获取当前定位(腾讯、高德、百度、天地图),火星坐标GCJ-02–>百度坐标BD-09,根据坐标经纬度计算两点距离的方法,点击链接打开地图导航的方法
  14. SQL注入 详解 有图有真相
  15. android刷机电脑版,安卓一键刷机助手
  16. 一套完整的测试应该由五个阶段组成
  17. win10磁盘管理_win10合并磁盘分区教程
  18. 离开了公司,你还有什么
  19. 生信学习-二代测序知乎专栏总结[转]
  20. macbook pro 2017版电池问题,八九十的电,用着忽然关机,再开机提示充电才行。

热门文章

  1. 德国银行继续对数字货币持观望态度
  2. 武汉理工实验3 循环结构(1)——7-3 最大公约数和最小公倍数
  3. 视频转GIF图2.0动图制作软件,提供三种GIF尺寸选择
  4. 【STM32】内部温度传感器示例
  5. 代码合乱了,git怎么强制覆盖分支?
  6. 重现期Matlab\Python程序(Gumbel和广义极值分布)
  7. 2021年中式烹调师(高级)考试及中式烹调师(高级)考试试卷
  8. Xftp 连接服务器
  9. 汕头大学信息与计算机学院研究生院,汕头大学研究生院
  10. Python全栈(十)Django框架之10.ORM模型对象和QuerySet方法