随机函数中UNPREDICTABLE是什么意思?

What is the meaning of the UNPREDICTABLE in random function?

在语言上我理解不可预测的意思。但是,在这段时间里,我经常发现可预测这个词在某些情况下。如果我进入一个有多个主题的区域,我通常会找到这些词,例如:

  1. Math.random vs crypto.getRandomValues in Javascript
  2. Random vs Secure Random numbers
  3. Etc

那么不可预测在随机函数中究竟意味着什么呢?那么一个随机函数被称为“不可预测随机函数”的条件是什么?

Predictable 是指种子本身来自可以预测的事物,例如 python random[=21= 中的时间] 图书馆:

import random, time

random.seed(time.time())
r1 = random.randrange(1e49, 1e50-1)

random.seed(time.time())
r2 = random.randrange(1e49, 1e50-1)

print(r1)
print(r2)

这里的输出是一样的。

不可预测 是指随机数的熵非常高,这样 none 才能真正找到初始种子并追踪所使用的随机算法。

如果一个值是随机的,则意味着知道序列中的前一个值无法提供有关下一个值的信息。

如果一个值不可预测,则没有 "practical" 确定下一个值的方法。它通常比 random 更强。

(这里的 "practical" 这个词在做一些工作。它通常意味着 "within some set of rules about what the attacker may do." 如果攻击者可以完全访问 CPU 和 RAM,那么什么都不是 "unpredictable," 但我们通常对他们没有这个的情况感兴趣。)

作为差异的一个例子,pi 的数字被认为是随机的(我们实际上并不知道这一点,但它似乎是真的)。这意味着没有比猜测更好的方法来猜测圆周率的第 10,000 位。这是随机的。但这是完全可以预见的。任何人都可以轻松确定其价值。所以 pi 的数字是一个非常好的随机序列,甚至可以有效地用于驱动随机性足够的游戏行为,但它不会是 secure 随机序列并且是对加密目的无用。

如果我去 random.org (which provides very good random numbers), and generated a value, but then used it repeatedly, it would be a random value but also completely predictable.

这种可预测性可以在生成 PRNG 的种子时发生。虽然 PRNG 可能会生成出色的随机值,但如果其种子是可预测的,那么整个序列都将是已知的。 ("Predictable" 这里并不意味着 100% 确定;任何比偶然性更好的确定程度就足够了。)

作为此问题的一个示例,网络设备在首次启动时会产生不可预测的种子,这是一个重大挑战,尤其是当附近的网络设备同时重新启动时。无论您使用什么过程来创建随机值,都可以很容易地落入一小组可能值("small" 与所有可能值相比;它可能仍然有数百万,但这在密码学中并不多)。在高安全性系统中,这是一个需要付出大量努力才能解决的问题。

大多数密码系统没有定义如何生成这些初始的、不可预测的值。它们只是系统的假定输入。