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