使用硬件(真)随机数生成器的 Linux 脚本
Posted
技术标签:
【中文标题】使用硬件(真)随机数生成器的 Linux 脚本【英文标题】:Linux script using a Hardware (True) Random number generator 【发布时间】:2018-10-28 03:13:05 【问题描述】:我想将我的 RPI3 中内置的硬件随机数生成器用于一个项目。目前我只能使用 /dev/hwrng 来保存二进制转储
dd if=/dev/hwrng of=data.bin bs=25 count=1
我的项目需要的是从随机源 (/dev/hwrng) 以 1 次读取/秒的频率读取 200 位长的数据块,并计算其中的 1 并将结果以十进制形式写入文本带有时间戳的文件,如下所示:
datetime, value
11/20/2018 12:48:09, 105
11/20/2018 12:48:10, 103
11/20/2018 12:48:11, 97
十进制数应始终接近 100,因为它是一个随机数据源,并且预期的 1 和 0 的数量应该相同。 任何帮助表示赞赏....
我确实想出了一个接近我不想要的 perl 脚本,所以让我分享一下。我相信它可以以更清洁的方式完成......
#!/usr/bin/perl
use strict;
use warnings;
use DateTime;
my @bitcounts = (
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3,
3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4,
3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2,
2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5,
3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5,
5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3,
2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4,
4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4,
4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6,
5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5,
5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
);
for (my $i=0; $i <= 10; $i++)
system("dd if=/dev/hwrng of=temprnd.bin bs=25 count=1 status=none");
my $filename = 'temprnd.bin';
open(my $fh, '<', $filename) or die "$!";
binmode $fh;
my $count = 0;
my $byte = 0;
while ( read $fh, $byte, 1 )
$count += $bitcounts[ord($byte)];
my $dt = DateTime->now;
print join ',', $dt->ymd, $dt->hms,"$count\n";
system("rm temprnd.bin");
sleep 1;
__END__
【问题讨论】:
计算大于 127 的字节数不是更简单吗,这可能会给出完全相同的结果......而且不需要 bash 级别的花哨的按位数学。 如果你想按位......可能会更简单地编写一个小的python或c程序来给你(c会快得多) 再次感谢您的更新。我试过了,它给了我预期的结果。但是我认为这与计算每一位并不完全相同,因为我们通过保持在字节级别来降低数据的分辨率。从统计上讲,在 200 字节的样本池中大于 127 的字节的平均值将接近 100,但随着我们降低位级分辨率,它会摆动得更多。为了保持在字节级别并实现与在位级别上相同的效果,我们需要一个查找数组,如下所示: 每个字节计数多少 |小数点0bin.net/paste/… 【参考方案1】:尝试运行以下代码
for ((n=0; n<200; ++n)); do echo $(date '+%m/%d/%Y %H:%M:%S'), $(od -vAn -N1 -tu1 < /dev/hwrng); sleep 1; done
如果要将其保存到文件中,请在最后添加简单重定向
> somefile
更新新请求,尝试运行以下代码
for ((n=0; n<10; ++n)); do
count=0
for ((s=0; s<200; ++s)); do
if (( $(od -vAn -N1 -tu1 < /dev/hwrng) > 127 )); then ((++count)); fi
done
echo $(date '+%m/%d/%Y %H:%M:%S'), $count
sleep 1
done
【讨论】:
感谢您的回答!我试过了,它一次读取 1 个字节并将其转换为十进制格式(0-255)。我不想从二进制转换为十进制,而是从随机源中读取一个 200 位(25 字节)长的块并计算其中的 1 并用时间戳打印它并每秒重复一次。我还将更新原始帖子以使问题更清楚。以上是关于使用硬件(真)随机数生成器的 Linux 脚本的主要内容,如果未能解决你的问题,请参考以下文章