播种Math :: Random ::来自/ dev / urandom的ISAAC:如何读取/传递128位?

时间:2013-02-13 15:58:59

标签: perl file unix random binary

在Perl中创建安全随机数的方法有很多种。大多数这些方法涉及一个或多个Perl模块。其中许多Perl模块需要更多的Perl模块作为依赖项。

由于我希望保持轻量级并减少所需的依赖性,我决定使用Math::Random::ISAAC,并自己从/dev/urandom播种。

那么,推荐的方法是在Perl中读取来自/dev/urandom的128位(我猜这是一个很好的数据),而不使用其他模块,然后将其传递给{ {1}}?

我不知道阅读和格式化的正确方法是什么,这里有the sub I will be passing the seed to:的副本

ISAAC

我不是数组,标量,字节串等细节的专家;所以我真的不知道如何将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。我确实认为128位是充足的随机性,但我不知道如何确保所有熵都使其成为@seed,并防止它在此过程中被截断为64位或32位。 / p>

1 个答案:

答案 0 :(得分:3)

从查看使用种子的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);