C中是否有random_device等价物

时间:2016-08-12 19:42:27

标签: c random

在C ++中,我们可以使用random_device生成真正的随机数(如果您的硬件支持)。我正在用C编写一次性Pad算法的实现。有没有办法在C中生成真正的随机数?我用C写作速度和其他一些原因。如果我使用PRNG,它将是不安全的。

char *KeyGenerate(unsigned long long StringLength)
{
    std::random_device TrueRandomNumberGenerator;
    char *Key = (char *) malloc(StringLength + 1);

    for(unsigned long long I = 0; I < StringLength; I++)
    {
        Key[I] = TrueRandomNumberGenerator();
    }
    Key[StringLength] = '\0';

    return Key;
}

3 个答案:

答案 0 :(得分:3)

C标准库非常小。要获得真正的随机数,您需要使用特定于操作系统的API。

在Linux系统中,您可以从/dev/urandom文件中获取加密强随机字节流。

答案 1 :(得分:1)

如在Linux上所述,您必须阅读/dev/urandom。在WIndows上,替代方法是使用CryptGenRandom

这是我在Python中所做的 - 在Linux上调用基于/dev/urandom的API,在Windows上调用CryptGenRandom

对OS X不够了解

答案 2 :(得分:0)

C使用PRNG(伪随机数生成器),因此您无法真正获得真正的随机数。

由于您的代码生成了一堆随机数,您可以简单地:

srand(time(NULL));
int r = rand();

其中srand(time(NULL));

将超过for循环。这样你种子一次,然后生成你的随机数