gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:26:37 25 4
gpt4 key购买 nike

我想在 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);
}

关于c - 如何在 C 中使用/dev/random 或 urandom?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2572366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com