在Perl中有许多方法可以创建安全的随机数。这些方法中的大多数都涉及一个或多个Perl模块。其中许多Perl模块甚至需要更多的Perl模块作为依赖项。
因为我想让它保持非常轻量级并减少所需的依赖性,所以我决定使用Math::Random::ISAAC,并自己从/dev/urandom中播种它。
那么,在不使用其他模块的情况下,用Perl从/dev/urandom读取128位(我猜这是一个很大的数量)数据,然后将其传递给ISAAC,推荐的方法是什么
我不知道正确的阅读和格式化方式是什么,这里有一个the sub I will be passing the seed to:的副本
sub new {
my ($class, @seed) = @_;
my $seedsize = scalar(@seed);
my @mm;
$#mm = $#seed = 255; # predeclare arrays with 256 slots
# Zero-fill our seed data
for ($seedsize .. 255) {
$seed[$_] = 0;
}
my $self = {
randrsl => \@seed,
randcnt => 0,
randmem => \@mm,
randa => 0,
randb => 0,
randc => 0,
};
bless($self, $class);
$self->_randinit();
return $self;
}我不是数组、标量、字节字符串等细节方面的专家,所以我真的不知道如何将urandom数据适当地格式化为@seed。我确实认为128位是足够的随机性,但我不知道如何确保所有的熵都进入ISAAC,并防止它在此过程中被截断为64或32位。
发布于 2013-02-14 00:19:09
从使用种子的ISAAC代码来看,它似乎需要32位的值。所以:
use autodie;
open(my $fh,'<','/dev/urandom');
my $buffer;
read($fh, $buffer, 16) == 16 or die "not enough read";
my @seed = unpack 'L4', $buffer;
my $isaac = Math::Random::ISAAC->new(@seed);https://stackoverflow.com/questions/14857609
复制相似问题