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)
呢?
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
使用方法或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","")
。
您可以随时使用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暂停对程序的执行,转而去执行处理这一事件的程序。等这些特殊事情处理完之后再回去执行之前的程序。中断一般分为三类: 内部异常中断:由计算机硬件异常或故障引起的中断; 软中断:由程序中执行了引起中断的指令而造成