首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从/dev/urandom中播种Math::Random::ISAAC :如何读取/传递128位?

从/dev/urandom中播种Math::Random::ISAAC :如何读取/传递128位?
EN

Stack Overflow用户
提问于 2013-02-13 23:58:59
回答 1查看 366关注 0票数 0

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

因为我想让它保持非常轻量级并减少所需的依赖性,所以我决定使用Math::Random::ISAAC,并自己从/dev/urandom中播种它。

那么,在不使用其他模块的情况下,用Perl从/dev/urandom读取128位(我猜这是一个很大的数量)数据,然后将其传递给ISAAC,推荐的方法是什么

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

代码语言:javascript
复制
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位。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-14 00:19:09

从使用种子的ISAAC代码来看,它似乎需要32位的值。所以:

代码语言:javascript
复制
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);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14857609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档