OpenSSL v0.9.8a随机数发生器分析之二——随机数发生器函数说明
3. 函数说明
默认的随机数发生器的调用函数为(代码见.\crypto\rand\md_rand.c)
- ssleay_rand_cleanup 置零
- ssleay_rand_status 获取状态信息
- ssleay_rand_seed 添加满熵种子
- ssleay_rand_add 添加信息
- ssleay_rand_bytes 产生随机数据
- ssleay_rand_pseudo_bytes 产生伪随机数据
熵源(Windows下的代码见.\crypto\rand\rand_win.c)
- 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 + num,STATE_SIZE)
步骤2:将输入数据buf以及内部状态中的环形缓冲区state(state从state_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 执行
- 4.1 计算杂凑值
local_md = HASH (local_md ||Si||Bi||md_count[0]||md_count[1])
- 4.2 更新Si = Si ⊕ local_md
- 4.3 更新md_count[1] = md_count[1]+1
步骤5:用更新的Si,i=0,1,2,...,n-1更新状态state:
state[state_index,..., state_index+num-1] = S0||S1||...||Sn-1
步骤6:用最后得到的local_md更新md = md ⊕local_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以及内部状态中的环形缓冲区state(state从state_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,执行
- 6.1 设置字符串pad:若k为0,则pad = getpid(),否则,pad = NULL为空串。
- 6.2 计算杂凑值
local_md = HASH( pad || local_md || md_count[0] || md_count[1] || Bi || Si)
注意:Bi是输出缓冲区,但这里读取了其中的数据
- 6.3 更新Si和Bi
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:用更新的Si,i=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随机数发生器分析之二——随机数发生器函数说明相关推荐
- OpenSSL v0.9.8a随机数发生器分析(合集)
OpenSSL随机数发生器 本文档对OpenSSL使用的随机数进行研究分析,主要涉及OpenSSL v0.9.8a的随机数发生器以及其在Windows系统下的熵源采集情况. 目录 1. 概况... 1 ...
- OpenSSL v0.9.8a随机数发生器分析之三——熵采集
4. 熵采集 熵采集函数为RAND_poll,它在不同操作系统下使用不同的熵源产生方式,Windows下的代码见.\crypto\rand\rand_win.c. 此外,不同的OpenSSL版本中其熵 ...
- 区块链安全—随机数安全分析(上)
一.前言 "随机数"在计算机程序中并不少见,开发人员也会经常使用随机数进行数值的模拟.预测.在C++程序里,我们经常使用一定的种子来进行随机数的生成过程.在计算机程序中,随机数可以 ...
- java生成随机数的方法_Java获取随机数的3种方法
随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串.数字.或者随即生成一个不定长度的数字.或者进行一个模拟的随机选择等等.Java提供了最基本的工具,可以帮助开发者来实现这一切. 一.Jav ...
- Spring Cloud源码分析(二)Ribbon(续)
因文章长度限制,故分为两篇.上一篇:<Spring Cloud源码分析(二)Ribbon> 负载均衡策略 通过上一篇对Ribbon的源码解读,我们已经对Ribbon实现的负载均衡器以及其中 ...
- Spring Cloud源码分析(二)Ribbon
断断续续看Ribbon的源码差不多也有7-8天了,总算告一段落.本文记录了这些天对源码的阅读过程与一些分析理解,如有不对还请指出. 友情提示:本文较长,请选择一个较为舒适的姿势来阅读 在之前介绍使用R ...
- php返回随机数,PHP内置函数生成随机数的方法汇总
PHP内部生成随机数的方法相比其他方法简单,不需要额外配置,是生成随机数的首选方案. 1 rand函数 rand() 函数可以不加任何参数,就可以生成随机整数.如果要设置随机数范围,可以在函数中设置 ...
- R语言使用rnorm函数生成正态分布随机数、自定义指定生成随机数的个数、均值、方差
R语言使用rnorm函数生成正态分布随机数.自定义指定生成随机数的个数.均值.方差 目录 R语言使用rnorm函数生成正态分布随机数.自定义指定生成随机数的个数.均值.方差 R 语言特点 R语言使用r ...
- BUCK电路分析(二)
BUCK电路分析(二) PSIM仿真同步BUCK电路 在上片文章中,初步的分析了BUCK电路的工作原理.本章使用PSIM软件仿真BUCK电路,观察分析BUCK电路器件关键波形.图1是同步BUCK电 ...
最新文章
- 回归 统计绘图_手把手教绘制回归分析结果的森林图「GraphPad Prism和Excel」
- 霍夫变换检测圆c 语言,c – 使用Hough变换检测圆
- harmonyos上的程序用什么语言写,HarmonyOS应用开发 — HelloWorld应用开发E2E体验
- Linux内核开发工作方向
- 基于mqtt协议的消息推送服务器,基于 MQTT 协议的推送服务
- double小数点后最多几位_30年前很火的零食,00后最多吃过2种,全吃过的至少是“叔叔辈”...
- initramfs下启动linux_和菜鸟一起学linux之initramfs方式启动
- python线程监控_Python实现线程状态监测简单示例
- [Java基础]反射概述
- 微服务架构最强讲解,那叫一个通俗易懂!
- python mac地址 js_使用Python从设备获取MAC地址
- SQL注入攻击原理与防御措施
- matlab免疫算法求解配送中心选址问题
- 微服务学习笔记 演进式架构 适应度函数概念
- 显示创建Mat对象的七种方式
- 新手织梦建站教程:设置网页文档默认点击数为0方法
- 运放自激震荡的大杂烩总结
- FC/NES PPU 示例汇编程序 简易画图
- 大顶堆,n个数中找最小的k个数
- docker privileged参数解释
热门文章
- Russian Dolls on the Christmas Tree
- 第十讲:如何去改变 第十一讲:改变——养成良好习惯 第十二讲:改变设定目标
- bzoj3054 Rainbow的信号(位运算+瞎搞)
- pta-7-5 字符串对比 (15 分)
- causalml 因果推断
- MAC下输入除号 (÷)等字符
- 讲真,java学习是有些困难,但迎难而上正是男儿本色(附学习资料) !
- HITCON CTF 2015 Quals Web 出題心得
- vivado 使用DocNav查xilinx资料
- 56 道高频 JavaScript 与 ES6+ 的面试题及答案