c - 如何在 C 中使用/dev/random 或 urandom?

我想在 C 中使用 /dev/random/dev/urandom。我该怎么做?我不知道如何在 C 中处理它们,如果有人知道请告诉我如何。谢谢你。

最佳答案

一般来说,最好避免打开文件来获取随机数据,因为过程中有很多故障点。

在最近的 Linux 发行版中,getrandom系统调用可用于获取加密安全的随机数,并且它不会失败 if GRND_RANDOMnot 指定为标志和读取量最多 256 个字节。

截至 2017 年 10 月,OpenBSD、Darwin 和 Linux(带有 -lbsd)现在都具有 arc4random 的实现这是加密安全的,不会失败。这使它成为一个非常有吸引力的选择:

char myRandomData[50];
arc4random_buf(myRandomData, sizeof myRandomData); // done!

否则,您可以像使用文件一样使用随机设备。你从他们那里读取数据,你会得到随机数据。我在这里使用 open/read,但 fopen/fread 也可以。

int randomData = open("/dev/urandom", O_RDONLY);
if (randomData < 0)
{
    // something went wrong
}
else
{
    char myRandomData[50];
    ssize_t result = read(randomData, myRandomData, sizeof myRandomData);
    if (result < 0)
    {
        // something went wrong
    }
}

您可以在关闭文件描述符之前读取更多随机字节。/dev/urandom 永远不会阻塞并且总是按照您的要求填充尽可能多的字节,除非系统调用被信号中断。它被认为是加密安全的,应该是您的首选随机设备。

/dev/random 更加挑剔。在大多数平台上,它可以返回比您要求的更少的字节,并且如果没有足够的可用字节,它会阻塞。这使得错误处理的故事更加复杂:

int randomData = open("/dev/random", O_RDONLY);
if (randomData < 0)
{
    // something went wrong
}
else
{
    char myRandomData[50];
    size_t randomDataLen = 0;
    while (randomDataLen < sizeof myRandomData)
    {
        ssize_t result = read(randomData, myRandomData + randomDataLen, (sizeof myRandomData) - randomDataLen);
        if (result < 0)
        {
            // something went wrong
        }
        randomDataLen += result;
    }
    close(randomData);
}

https://stackoverflow.com/questions/2572366/

相关文章:

Python 风格 - 用字符串续行?

linux - 可能有多少个套接字连接?

python - 为什么不自动调用父类(super class) __init__ 方法?

linux - linux命令末尾的 "&"是什么意思?

python - 两个长度不等的列表之间的排列

linux - 在 grep 中转义双引号

python - Django admin 中同一模型的多个 ModelAdmins/ View

python - Python 2和3之间numpy数组的pickle不兼容

python - 在 localhost 上,我如何选择一个空闲端口号?

linux - SVN中结帐和导出的区别