【发布时间】:2016-12-14 18:39:43
【问题描述】:
我的理解是 PRNG 的工作是使用输入种子和将其转换为非常不相关的输出的算法,以便下一个生成的数字尽可能不可预测。但这是我看到的问题:
我能想象到的任何伪随机数生成器都必须有有限数量的结果。假设我正在使用一个随机数生成器,它可以生成 0 到 1000 亿之间的任何数字。如果我要求输出一千亿和一次,我可以确定一个数字已经输出了不止一次。如果相同的种子在通过算法时总是给出相同的输出,那么我可以确定 PRNG 将开始一个循环。我的逻辑哪里有缺陷?
如果我是正确的,如果你知道 PRNG 的算法,并且 PRNG 被用于加密,那么不能使用这种方法(并且有任何措施来防止它吗?):
- 使用 PRNG 生成可能的整个循环数字集。
- 知道生成私钥的时间戳,然后知道 PRNG 的时间 AND 输出
- 根据计算所需的时间,确定已知输出和未知输出之间有多少个数字
- 在预先生成的列表中查找生成的号码
【问题讨论】:
-
“使用 PRNG 生成可能的整个循环数字集”。如果你能等上 10^100 年,当然,去吧。
-
请记住,状态不必与输出的大小相同。即使您只获得 32 位输出或 64 位输出,状态也可能是 256 位,太大而无法等待它循环。
-
@user2357112 而不是循环,该算法可以只向状态添加更多位,使其在每秒十亿次输出的情况下再过数十亿年,然后才会有重复的风险。