【问题标题】:What is the difference between Pycrypto's Random.get_random_bytes and a simple random byte generator?Pycrypto 的 Random.get_random_bytes 和简单的随机字节生成器有什么区别?
【发布时间】:2014-03-14 03:15:30
【问题描述】:

我在Pycrypto遇到了这个方法,用来生成随机字节:

from Crypto import Random
Random.get_random_bytes(5)

我想知道这种方法与下面的简单生成器有何不同:

import random
def get_random_bytes(N):
    ASCII = "".join(chr(x) for x in range(255))
    return "".join(random.choice(ASCII) for _ in range(n))

注意:我的直觉是 Pycrypto 方法在密码学上更“可靠”。查看random的文档,它说它是基于一个生成器,周期为2**19937-1。查看Random.get_random_bytes,它声明它能够生成加密强字节。这是什么意思?

当然,我希望使用库实现,而不是我自己的。我只是想了解它背后的密码学概念。

【问题讨论】:

    标签: python random pycrypto


    【解决方案1】:

    对于加密安全的随机数生成器,任何输出序列都不会为您提供下一个输出将是什么的信息。

    random 基于 Mersenne Twister。它具有 624 个 32 位数字的内部状态。给定 1248 个值的输出,您可以知道某个时刻的整个状态。从中您可以 100% 准确地确定所有未来的输出。

    【讨论】:

    • 没错。换句话说,虽然random 可能有一个2**19937-1 的周期,但这只是保证它不会在那个周期内重复相同的序列。完全有可能确定您目前在该时期的哪个位置获得相对(相对于该时期)少量样本并随后对其进行跟踪。
    • 我明白了。我想这将是一个不同的问题,但是 Pycrypto 的 Random 是如何克服random 问题的呢?不也是一种伪随机算法,最终也会有同样的限制吗?
    • 一个加密安全的随机数生成器通常会维护不同的池,这些池中充满了来自网络活动、击键时间、鼠标点击时间、硬盘驱动器时间等的熵。这些池以不同的时间间隔混合和散列到内部状态。输出是通过另一个散列从内部状态生成的。因此,您无法重新创建内部状态。此外,内部状态的变化不是规律的(没有模式),而是取决于外部来源。
    • user515430,您的链接没有说明您所说的内容。它不讨论熵
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 2013-06-17
    • 2011-08-26
    • 2010-11-04
    • 2011-12-06
    相关资源
    最近更新 更多