我正在尝试使用 linux 从 /dev/random/ 读取...
这总是输出 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