在两台不同的计算机上用 python 中的种子生成相同的 "random numbers"

Generating the same "random numbers" with a seed in python on two different computers

我正在尝试使用函数 "genKeys" 生成相同的随机序列列表。 使用相同的种子,我会得到相同的列表,但仅限于我的笔记本电脑。

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

我猜RNG不一样。

有没有办法"unify"生成数字的方式或实现生成相同数字的算法?

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 的 random.Random 不是合适的选择;它的底层算法 Mersenne Twister 不是加密随机生成器。

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

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