Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C openssl随机加载文件始终返回0_C_Ssl_Random_Openssl_Entropy - Fatal编程技术网

C openssl随机加载文件始终返回0

C openssl随机加载文件始终返回0,c,ssl,random,openssl,entropy,C,Ssl,Random,Openssl,Entropy,我正在尝试在linux上使用读取/dev/random/ int bytes = RAND_load_file("/dev/random", 16); printf("%d bytes read", bytes); 这总是输出读取的0字节 /dev/random由软件熵源提供。我确保/dev/random确实有足够的数据。根据docsRAND\u load\u文件应返回读取的字节数,但这不会发生 我正在尝试使用以下命令读取linux上的/dev/random/ 这总是输出读取的0字节 根据Ur

我正在尝试在linux上使用读取
/dev/random/

int bytes = RAND_load_file("/dev/random", 16);
printf("%d bytes read", bytes);
这总是输出读取的0字节

/dev/random
由软件熵源提供。我确保
/dev/random
确实有足够的数据。根据docs
RAND\u load\u文件
应返回读取的字节数,但这不会发生

我正在尝试使用以下命令读取linux上的/dev/random/

这总是输出读取的0字节

根据
Uradom(4)
手册:

字符特殊文件/dev/random和/dev/urandom(存在) 由于Linux 1.3.30)提供了内核随机数的接口 发电机

读取时,/dev/random设备将只返回随机字节 在熵池中估计的噪声位数内。 /dev/random应该适用于需要非常高质量的用途 随机性,如一次性键盘或密钥生成。当 熵池为空,从/dev/random读取的数据将被阻止,直到 收集了额外的环境噪声

有些操作系统会阻塞,比如OpenBSD。其他操作系统不会阻塞,比如Debian和Ubuntu。对于那些在短时间读取时不阻塞的数据,它们返回实际返回的字节数(可能小于请求的字节数)。所以你的第一个问题可能是熵损耗。您应该检查
errno
以获取更多信息

我也看到过在向设备添加熵的过程中,在估计熵时使用整数数学的问题。当您尝试从设备中随机抽取数字时,问题会在系统中蔓延并显现出来。比如:

int bytes = 128;
int estimate = bytes / 256;
问题是您需要的是
浮点
,而不是
int
。否则,熵的估计值为0

int bytes = 128;
float estimate = (float)bytes / 256;

/dev/random由软件熵源提供。我确保/dev/random确实有足够的数据

这对我来说有点危险。。。LWN.net上讨论了一件您不应该做的事情:。不要将
dev/random
链接到
/dev/urandom
。你可能应该走近去讨论你的需求和方法

有很多好的读物从我们的网站上返回。我看到移动操作系统的补丁已经讨论过了,这可能会帮助你解决更大的工程问题


此外,以下是同一手册页中的内容:

如果您的系统没有/dev/random和/dev/urandom 已创建,可以使用以下命令创建它们:

mknod -m 644 /dev/random c 1 8
mknod -m 644 /dev/urandom c 1 9
chown root:root /dev/random /dev/urandom
当Linux系统启动时,没有太多操作员交互, 熵池可能处于相当可预测的状态。这 降低熵池中的实际噪波量(低于 估计为了抵消这种影响,它有助于 熵在关闭和启动过程中汇集信息。为此,, 将以下行添加到运行的适当脚本中 在Linux系统启动顺序期间:

echo "Initializing random number generator..."
random_seed=/var/run/random-seed
# Carry a random seed from start-up to start-up
# Load and then save the whole entropy pool
if [ -f $random_seed ]; then
    cat $random_seed >/dev/urandom
else
    touch $random_seed
fi
chmod 600 $random_seed
poolfile=/proc/sys/kernel/random/poolsize
[ -r $poolfile ] && bytes=`cat $poolfile` || bytes=512
dd if=/dev/urandom of=$random_seed count=1 bs=$bytes
另外,在运行的适当脚本中添加以下行 Linux系统关闭期间:

# Carry a random seed from shut-down to start-up
# Save the whole entropy pool
echo "Saving random seed..."
random_seed=/var/run/random-seed
touch $random_seed
chmod 600 $random_seed
poolfile=/proc/sys/kernel/random/poolsize
[ -r $poolfile ] && bytes=`cat $poolfile` || bytes=512
dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

您的代码是正确的,问题显然是在阅读
/dev/random/
时。如果没有足够的数据,程序就会等待。您可以尝试检查一些权限,尽管我不必做任何事情来让它工作。出于好奇,什么操作系统?是Debian吗?据我所知,Debian是唯一一个没有现代熵收集器的现代桌面/服务器操作系统,它在2015年被耗尽——RHEL 6。我尝试了cat/dev/random,它很活泼。