c - 即使提供的种子相同,为什么 openssl 给出不同的随机数?

标签 c random openssl

我正在使用 openssl 随机数生成器 api 编写一个随机数生成器。我正在向随机数生成器提供种子。使用 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;
}

最佳答案

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

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

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

关于c - 即使提供的种子相同,为什么 openssl 给出不同的随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19656010/

相关文章:

c - 求N个人生日相同的概率

c - 这个三元运算符的结果是什么?

c++ - 运行时检查失败 #0 -(ESP 的值未正确保存)- 调用存储在结构中的函数时

c - 从指令中获取两个字符串

两位小数之间的 PHP 随机小数,步长为 0.5

aws-lambda - 为什么当 openssl 不在依赖关系图中时,openssl 上的交叉编译构建会失败?

objective-c - ObjC 访问 C 函数中的属性

iphone - 完全神秘 - iOS 方法在随机延迟后执行

交叉编译 OpenSSL - 无法执行 openssl 二进制文件

c - OpenSSL 更新到更新版本 : Alternative for the deprecated `OPENSSL_config`