openssl中随机数产生的原理

本文详细介绍了OpenSSL中随机数的生成原理,包括全局变量的初始化、不同平台的初始化流程,以及RAND_poll()和RAND_add()函数的作用。通过读取系统熵源如/dev/urandom,结合PID、UID、时间等信息,使用哈希计算增强随机性,确保生成的随机数质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

  1. 第一步用RAND_poll()初始化MD_DIGEST_LENGTH长度的全局变量md。
    1.1 初始化过程用读取/dev/urandom /dev/urandom等方式读取原始的32字节,以RAND_add的方式将结果存入全局数组md。(UNIX的实现过程)
    1.2 然后RAND_add上pid、uid、time等数据。
  2. RAND_add “…”
  3. 计算pid、time、FILETIME、全局数组md、md_c、全局状态数组state的哈希值。循环此过程填充输出结果的buf直到指定的num长度。
  4. 利用第3步的计算机国更新全局数组md,下一次调用此随机数将不调用第1步,而直接从第2步开始,初始化数据从本次的计算结果。
  5. RAND_add的计算方法:计算全局数组md、全局状态数组state、被Rand_add的数组、md_c的哈希值存入全局数组md。

全局变量:

#define STATE_SIZE 1023
static size_t state_num = 0, state_index = 0;
static unsigned char state[STATE_SIZE + MD_DIGEST_LENGTH];
static unsigned char md[MD_DIGEST_LENGTH];
static long md_count[2] = { 0, 0 };

公式化流程:

  1. md的初始化:
    1.1 windows
    RAND_add(buf = CryptGenRandom(),add=64);
    RAND_add(time, add=0);
    RAND_add(GlobalMemoryStatus(), add=1);
    RAND_add(CurrentProcessId, add=1);
    1.2 OPENSSL_SYS_VOS
    RAND_ad

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值