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

推荐答案

一般来说,最好避免打开文件以获取随机数据,因为过程中存在多个故障点.

在最近的Linux发行版上,getrandom系统调用可用于获取加密安全的随机数,它不能失败if GRND_RANDOM被指定为标志,读取量最多为256字节.

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

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);
}

C++相关问答推荐

为什么这个select()会阻止?

找出文件是否包含给定的文件签名

在C语言中使用scanf()时我无法理解的警告

丑陋的三重间接:可扩展的缓冲区管理 struct

当多个线程在C中写入相同的文件描述符时,如何防止争用情况?

#If指令中未定义宏?

ATmega328P EEPROM未写入

使用scanf在C中读取和存储文件中的值

如何在STM8项目中导入STM8S/A标准外设库(ST VisualDeveloper)?

无法在OpenGL上绘制三角形

我的C函数起作用了,但我不确定为什么

将变量或参数打包到 struct /联合中是否会带来意想不到的性能损失?

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

C-try 将整数和 struct 数组存储到二进制文件中

为什么我的半数组测试和奇数组测试不起作用?(我使用Assert进行调试)

C struct 中的冒泡排序

将数组中的所有元素初始化为 struct 中的相同值

使用替代日历打印日期

传递参数:C 和 C++ 中 array 与 *&array 和 &array[0] 的区别

在链表中插入一个值