我想在 C 中使用 /dev/random
或 /dev/urandom
。我该怎么做?我不知道如何在 C 中处理它们,如果有人知道请告诉我如何。谢谢你。
最佳答案
一般来说,最好避免打开文件来获取随机数据,因为过程中有很多故障点。
在最近的 Linux 发行版中,getrandom
系统调用可用于获取加密安全的随机数,并且它不会失败 if GRND_RANDOM
是 not 指定为标志和读取量最多 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/