当前位置: 首页 > 知识库问答 >
问题:

如何实现Python的操作系统。Perl 6中的Uradom方法?

岑和风
2023-03-14

I'am converting a module writing in Python to Perl 6。在模块中,有一个名为create\u key的方法,它使用操作系统。用于加密的urandom:

def create_key(size):
    return binascii.hexlify(os.urandom(size))[:16]

该文档描述了操作系统。urandom作为:

返回适合加密使用的大小随机字节字符串

在Perl 6中,有一个名为Buf的类,但它没有随机方法。那么如何使用Perl 6实现os.urandom(size)呢?

共有3个答案

劳华灿
2023-03-14
sub urandom(Int:D \size) { Buf.new: (^256).roll(size) }
say urandom(16);  # Buf:0x<98 43 10 A7 5A FD 62 4B AB 1E 42 6D 24 70 E6 89>

或者,作为字符串:

say urandom(16).list.fmt("%x","");  # bfa1c6fef9784ba31b17cdb135ce6622

或者将其放在Uradom中:

sub urandom(Int:D \size) { Buf.new((^256).roll(size)).list.fmt("%x","") }
say urandom(16);  # bfa1c6fef9784ba31b17cdb135ce6622
江仲渊
2023-03-14

使用方法或subroll不会为您提供适合加密使用的随机字节。他们只是使用perl6提供的内置伪随机数生成器,这是moarvm上rakudo情况下的mersenne twister。

相反,您需要的是一个类似于例如Crypt::Random的库,它模仿Arc4Random,并被描述为在unices上使用/dev/urandom,在windows上使用CryptGenRandom。您可以在github上找到它或直接使用zef install Crypt::Random安装它。

使用该模块中的crypt_random_buf子模块将为您提供所需大小的buf,然后您可以将其转换为一串十六进制数字,就像在另一个答案中一样,使用。list.fmt("%x","")

弘浩博
2023-03-14

您可以随时使用Python的Uradom

sub py-urandom( UInt $size ){
  use Inline::Python;

  state $py = Inline::Python.new; # reuse the same instance
  once $py.import('os');          # load the Python os library only once

  $py.call('os','urandom', $size);
}

say py-urandom(10)».fmt('%02X').join;  # 1473A7D5455F15D3726B

要使以上内容正常工作,需要安装python dev操作系统包。然后使用zef安装Python。

您可以使用binascii。还有hexlify

sub create-key ( UInt $size ) {
  use Inline::Python;

  state $py = Inline::Python.new;
  once $py.import('os');
  once $py.import('binascii');

  $py.call('binascii','hexlify', $py.call('os','urandom',$size)).decode('ascii');
}

我确信有更好的方法来完成上述任务,但这是我第一次使用内联::Python。(这应该是显而易见的,因为我必须安装python dev才能回答这个问题)

另一种从长远来看可能更好的方法是调用getrandom、getentropy或CryptGenRandom,具体取决于它是在Linux、OpenBSD还是Windows上运行。基本上复制操作系统的实现。urandom。

下面是一个快速编写的示例。

sub urandom ( UInt $size ){
  use NativeCall;

  my constant is-win = $*DISTRO.is-win;
  my constant is-openbsd = $*DISTRO.name eq 'openbsd';

  if is-win {
    fail "urandom doesn't handle Windows yet";
    # It is more involved on Windows, and I don't use Windows

  } elsif is-openbsd {
    # note that this is untested as I don't use OpenBSD
    if $size > 256 {
      fail "urandom doesn't handle more than 256 on OpenBSD"
      # note that this could be changed to load it in 256 byte chunks
    }

    sub getentropy( Buf \buf, size_t \buflen --> int32 ) is native {}

    my Buf $buf .= allocate($size);
    my $result = getentropy( $buf, $size );

    fail if $result !== 0;
    $buf

  } else { # presumably Linux or other UNIX-like

    sub getrandom (Buf \buf, size_t \buflen, uint32 \flags --> ssize_t) is native {}

    my Buf $buf .= allocate($size);
    my $total = getrandom( $buf, $size, 0 );

    fail unless $total == $size; # could be changed to call it for the rest
    $buf;
  }
}
say urandom(10)».fmt('%02X').join; # 0EF9EDB3EBC724C0E9CE

如果您使用的是带有dev/uradom的系统,那么您可以直接从中读取。

sub urandom ( UInt $size ){
  my $urandom will leave {.close}
    = '/dev/urandom'.IO.open(:bin,:ro);
  $urandom.read( $size )
}

say urandom(10)».fmt('%02X').join; # 01B6C41AD0A77732C328


它实现了Windows所需的代码,而我没有,但它在*NIX系统上使用/dev/urandom文件。

# alias &Crypt::Random::crypt_random_buf as &urandom
my &urandom = do {
  use Crypt::Random;
  &crypt_random_buf
}

say urandom(10)».fmt('%02X').join; # 841720513678B1811E2D
 类似资料:
  • 更多面试题总结请看:【面试题】技术面试题汇总 互斥锁的实现 1. 禁止中断 进入临界区前禁止中断,离开之前恢复中断。这样任何中断都不会发生,包括时钟中断,也就是说 CPU 不会被切换到其他线程。 优点是实现简单。缺点有很多: 给用户禁止中断的权利很危险,如果用户进程死循环,操作系统可能永远无法获取控制权 只适用于单 CPU 的场景,其他 CPU 上运行的线程仍然可以访问临界资源,因为不同 CPU

  • 问题内容: 我要检查操作系统(在运行脚本的计算机上)。 我知道我可以在Linux 中使用它,但是它在控制台中给了我一条消息,我想写一个变量。 如果脚本可以告诉您它是Mac,Windows还是Linux,那就可以了。我该如何检查? 问题答案: 您可以使用: 具有比更好的粒度。 有关有效值,请参阅文档。

  • 本文向大家介绍Python实现获取操作系统版本信息方法,包括了Python实现获取操作系统版本信息方法的使用技巧和注意事项,需要的朋友参考一下 最近,想在我的YouMoney(http://code.google.com/p/youmoney/)里面增加提取用户操作系统版本信息。比如windows用户,可能要返回Windows XP ,或者Windows 2003, 苹果用户应该返回Mac OS

  • 本文向大家介绍python修改操作系统时间的方法,包括了python修改操作系统时间的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python修改操作系统时间的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Python程序设计有所帮助。

  • 该程序创建一个线程,用dir()读取目录,并将文件放在通道上$N个工作线程读取该通道并“处理”(打印)文件。 然而,我得到了这个“等待的第一个操作:”错误。 关于这个错误,我已经在陷阱页面上读了好几遍了,但还是没有弄明白。能解释一下这里发生了什么吗? 目录内容: 运行程序: 程序travers-dir. p6:

  • 操作系统提供的服务 操作系统的五大功能,分别为:作业管理、文件管理、存储管理、输入输出设备管理、进程及处理机管理 中断 所谓的中断就是在计算机执行程序的过程中,由于出现了某些特殊事情,使得CPU暂停对程序的执行,转而去执行处理这一事件的程序。等这些特殊事情处理完之后再回去执行之前的程序。中断一般分为三类: 内部异常中断:由计算机硬件异常或故障引起的中断; 软中断:由程序中执行了引起中断的指令而造成