使用当前时间戳猜猜python随机种子

时间:2016-04-14 03:03:17

标签: python cryptography random-seed

目前我收到了一个python文件。它有以下代码(与服务器交互):

random.seed(time.time())
random.randint(0, 10000) // number 1, server gives me
random.randint(0, 10000) // number 2, server gives me
random.randint(0, 10000) // number 3, server gives me
random.randint(0, 10000) // <- this is the number I have to guess, server does not give to me

我想猜测正确的种子值以猜测数字链。但time.time()返回浮点数。那么random.seed将使用多少个数字?我知道如果种子值是一个整数会更容易,但现在这是一个浮点数,而且我被卡住了。

2 个答案:

答案 0 :(得分:0)

编辑:我的逻辑关闭了... woops。答案仍然是一样的。 random.seed(time.time())似乎使用time.time()生成的舍入数字。

a = time.time()  # say print(a) produces 1234567890.123456
b = 1234567890.123456

random.seed(a) # this will produce the same seed value as
random.seed(b) # this

答案 1 :(得分:0)

random.seed()函数接受一个可散列对象,并使用所述对象的散列作为其种子。 (例外是intlong,它们直接使用而不进行散列,请参阅下面的编辑。)如果您希望能够显式设置种子,那么您需要创建一个可以使用的哈希对象控制哈希。例如:

#!/usr/bin/env python3                                                          

import random

class HashMe(float):
    '''                                                                         
    A test for a hashable that can have its hash set by brute force.            
    '''
    def __init__(self, hash_val):
        self.hash_val = hash_val

    def __hash__(self):
        return self.hash_val

a = HashMe(42)
print('HashMe(42) hashes to: ', a.__hash__())

print('\nSeed with a')
random.seed(a)
for _ in range(4):
    print(random.randint(0, 10000))

print('\nReseed with random data...')
random.seed(random.random())
for _ in range(4):
    print(random.randint(0, 10000))

print('\nSeed with a again - et voila!')
random.seed(a)
for _ in range(4):
    print(random.randint(0, 10000))

产生预期的:

HashMe(42) hashes to:  42

Seed with a
1824
409
4506
4012

Reseed with random data...
9359
4313
6609
6598

Seed with a again - et voila!
1824
409
4506
4012

说了这么多,即使是糟糕的Python PRNG,周期的长度足够长,以至于你不可能根据猜测种子来破译序列。

编辑:当然,在把它放在一起后,我浏览了Python源代码,看看如果种子是int或long,它只是直接使用种子值,所以不需要hashable shuck和jive来绕过它。生活和学习。