首页 > 解决方案 > 如果种子既可以是时间也可以是来自 /dev/urandom 的熵,为什么 random.randbytes() 不安全?

问题描述

/dev/urandom 用于更推荐的 secrets.py 库中。也有人说随机模块使用当前时间或 /dev/urandom 中的系统熵。然后:

Ps 我看过一个类似的问题。由于前一个问题仍未得到解答,我的好奇心仍未得到充分满足。

这个问题是在我查看https://github.com/tna0y/Python-random-module-cracker之后才出现的

标签: pythonsecurityrandomcryptography

解决方案


您链接到的饼干表明它可以根据先前的值预测未来的值。所以想象一下这种(极端)情况:对于某些加密,您构建一个具有 624*32 随机位的公钥,然后构建一个具有 624*32 随机位的私钥。然后我们可以根据您的公钥计算出您的私钥。不好。

演示结果:

47 out of 100 private keys cracked

演示代码:

import random, os
from randcrack import RandCrack

def create_keys():
    random.seed(os.urandom(10000))
    public_key = [random.getrandbits(32) for _ in range(624)]
    private_key = [random.getrandbits(32) for _ in range(624)]
    return public_key, private_key

def crack(public_key):
    rc = RandCrack()
    for x in public_key:
        rc.submit(x)
    cracked_private_key = [rc.predict_getrandbits(32) for _ in range(624)]
    return cracked_private_key

def demo():
    cracked = 0
    for attempt in range(1, 101):
        public_key, private_key = create_keys()
        cracked += crack(public_key) == private_key
        print(cracked, 'out of', attempt, 'private keys cracked')

demo()

推荐阅读