为什么openssl提供不同的随机数,即使提供的种子是相同的?

时间:2013-10-29 10:45:59

标签: c random openssl

我正在使用openssl随机数生成器apis编写一个随机数生成器。我正在为随机数发生器提供种子。使用openSSL的RAND_seed() api将种子提供给openssl,在给出种子之后,我调用Rand_bytes() api来获取随机数。

但问题是,如果种子相同,Rand_bytes应该给我相同的随机数,但在我的情况下,我没有得到相同的随机数。这种行为的原因是什么?解决办法是什么 ? 代码如下:

#define _64BIT_SIZE 8

int GenerateRandom_64(unsigned char * apcRandom_64)
{
    unsigned char cRandBytes_64[_64BIT_SIZE] = {0},
                  cSeed_64[_64BIT_SIZE]      = 
                                   {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
    RAND_seed(cSeed_64, _64BIT_SIZE); /* seed  is cSeed_64 */
    if(!RAND_bytes(apcRandom_64, _64BIT_SIZE))
        printf("nOt seeded the random bit generator properly\n");
    return 0;
}

1 个答案:

答案 0 :(得分:0)

RAND_seed()与调用RAND_add()相同,其中entropy参数采用与种子缓冲区中的字节数相同的值。 RAND_add()将种子数据混合到熵池中。在具有/dev/urandom的系统上,熵池将从中预先播种。

因此,RAND_bytes()将始终产生不可预测的序列,除非您在未提供/dev/urandom的计算机上运行。

可以在RAND_add()手册页中找到更多信息。