我正在尝试使用。
从Linux上的/dev/random/
读取
int bytes = RAND_load_file("/dev/random", 16);
printf("%d bytes read", bytes);
这总是输出0字节读数。
/dev/random
由软件熵源提供。我确保/dev/random
确实有足够的数据。根据文档RAND_load_file
应该返回否。读取的字节数但是没有发生。
答案 0 :(得分:0)
我尝试使用...读取/ dev / random / on linux
这总是输出0字节读数。
根据urandom(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;
问题是您需要float
,而不是int
。否则,您的熵估计值为0.
int bytes = 128;
float estimate = (float)bytes / 256;
/ dev / random由软件熵源提供。我确保/ dev / random确实有足够的数据。
这对我来说有点红旗......你不应该做的一件事在LWN.net上讨论:Don't play dice with random numbers。不要将dev/random
与/dev/urandom
联系起来。你可能应该徘徊到Information Security Stack Exchange并讨论你的需求和方法。
从linux random number generator site:lwn.net返回了很多好的阅读材料。我看到了移动操作系统的补丁,这可能会帮助您解决更大的工程问题。
此外,来自同一手册页:
如果您的系统没有/ 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