0

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

由于我想保持轻量级并减少所需的依赖项,因此我决定使用Math::Random::ISAAC,并自己从/dev/urandom.

那么,在不使用其他模块的情况下,在 Perl 中读取 128 位(我想这是一个很好的数量)数据/dev/urandom,然后将其传递给的推荐方法是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数据@seed。我确实认为 128 位有很多随机性,但我不知道如何确保所有的熵都变成ISAAC,并防止它在此过程中被截断为 64 或 32 位。

4

1 回答 1

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);
于 2013-02-13T16:19:08.997 回答