【问题标题】:Generating the same "random numbers" with a seed in python on two different computers在两台不同的计算机上用 python 中的种子生成相同的“随机数”
【发布时间】:2020-04-24 19:06:22
【问题描述】:

我正在尝试使用函数“genKeys”生成相同的随机序列列表。 使用相同的种子,我将获得相同的列表,但仅在我的笔记本电脑上。

在我的 Raspberry Pi 上运行这段代码,我得到了一个完全不同的列表。

我猜RNG是不同的。

有没有办法“统一”生成数字的方式或实现生成相同数字的算法?

def genKeys(number, seed, length):

    rng = random.Random(seed)
    seq = "abcdefghijklmopqrstuvxyzABCDEFGHIJKLMOPQRSTUVWXYZ1234567890 +-.,!%/?<>^_[]#$"
    key = open("key.txt", "w")

    for i in range(0, number):
        gen = ""
        n = 0

        while n < length:
            charGen = rng.choice(seq)
            gen += charGen
            n = n + 1

        key.write("%s\n" % (gen))

    key.close()

背景:这些密钥将用作一次性密钥来加密消息。

【问题讨论】:

标签: python python-2.7 encryption random one-time-password


【解决方案1】:

为了生成加密密钥,Python 的random.Random 不是一个合适的选择;它的底层算法 Mersenne Twister 不是加密随机生成器。

取而代之的是所谓的密钥派生函数(KDF,也称为加盐哈希),它采用种子和盐来生成加密密钥。为了减轻预计算攻击,盐是必要的。如果种子相对容易猜到(例如,种子是密码),一些 KDF 会故意花费大量时间和/或内存来计算,以减轻字典攻击。

如果您的目标是在两台计算机之间(例如,在 Raspberry Pi 和 PC 之间)安全地发送消息,则很难进一步帮助您,因为正确的解决方案取决于您的需求。例如,已经建立了在两台计算机之间建立安全通道的协议,包括传输层安全 (TLS)、J-PAKE 等。一次性密码算法包括基于哈希的一次性密码(HOTP)、基于时间的一次性密码(TOTP)等。尤其是安全协议,实现起来绝非易事,最好通过专用的 Python 包在 Python 中访问。

【讨论】:

  • @kelalaka:我会提到它(和其他加密 RNG),但一般来说,加密 RNG(与密钥派生函数相反)不允许在计算机之间重现随机数,正如这个问题想要的那样。相反,它们生成的数字旨在让外部观察者无法预测。
  • 是的,OP 想要 OTP。也许你也应该提到这一点。不实用等。在现代密码学中,我们使用混合密码系统......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 2017-07-30
相关资源
最近更新 更多