我想在C中使用/dev/random
或/dev/urandom
.我该怎么做?我不知道如何在C语言中处理它们,如果有人知道,请告诉我如何处理.非常感谢.
我想在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);
}