了解 PRG:我们如何扩展随机性?

信息安全 随机的 密钥生成
2021-08-28 13:16:57

对密码学中使用的PRG有点困惑。

基本上,PRG 用于将长度为 s 的随机序列(主要是密钥)扩展为长度n >s,看起来仍然是随机的。现在虽然这在数学意义上显然是不可能的,但我们的想法是我们实现了合理的随机性,这意味着一个有效的区分器无法将更大的序列与随机区分开来(因此我们在计算意义上实现了随机性)。我的问题是我们真的吗?

考虑这个例子:
输入: k: {0,1}^2
PRG G: {0,1}^2 -> {0,1}^4
输出: k' = G(k) : {0,1}^ 4

这意味着我们的初始键可以采用 4 个可能的值。尽管我们的派生密钥涵盖了 16 个值的范围,但它只能取这 16 个值中的 4 个,因为 PRG 是确定性的。那么是什么阻碍了我将可能的初始密钥映射到输出密钥作为攻击呢?因此,我可以将搜索空间从 16 个值减少到 4 个值。所以基本上反转扩展?

我现在认为,只要我们有内存来存储这些映射,我们就不会实现任何随机性扩展。由于有一些常用的 PRG,这将激励协作项目映射所有或至少部分密钥以破坏许多应用程序的安全性。

我确信我上面一定有什么问题,但我无法弄清楚我的错误在哪里。能否请你帮忙?

非常感谢

2个回答

加密安全的 PRNG从攻击者未知的初始状态(通常称为“种子”)开始。我们可以将状态视为n位的序列。从该状态开始,PRNG 确定性地工作并输出大量位,内部状态不断更新。

有一种理论上可以应用于所有 PRNG通用攻击,称为“穷举搜索”或“蛮力”:即尝试种子的所有可能值,直到找到与观察到的输出匹配的值。这种攻击的成本平均为2 n-1 次“尝试”(平均而言,您必须尝试一半可能的种子值,然后才能找到正确的值)。通过使n足够大以至于2 n-1是一个大得离谱的值,这种通用攻击被挫败了好的算法传统上使用n = 128或更多,这已经足够大了

当然,对于 2 位初始状态,穷举搜索非常快:只有 4 个种子值是可能的!

所以我们需要一个大的初始状态。困难的部分是设计一个 PRNG,这样通用攻击也是最好的攻击;即,没有使用 PRNG 结构的“捷径”,它允许有效地修剪出大部分候选种子,而无需全部尝试。这很难,并且没有得到数学理论的充分证实:从数学上讲,没有证据表明安全的 PRNG 甚至可以存在;所以我们把很多“加扰操作”放在一起,将数据混合在一起,我们希望能做到最好。更难的是设计这样的混合物,以使结果不仅安全而且快速。目前,我们能做的最好的事情就是让一些密码学家在设计中投入大量思考,然后将其提交给许多其他试图破解它多年的密码学家。幸存的设计被认为是“可能安全的”。eSTREAM 产品组合为此付出了努力。

我现在认为,只要我们有内存来存储这些映射,我们就不会实现任何随机性扩展。

如果您只期望 PRG 的 4 位输出,那么您是正确的。

记住安全 PRG 的定义——给定两个输入,一个是真正随机的,一个是使用 PRG 生成的,不存在可以有效区分这两者的对手。

给定一个可以产生任意 n 位长度输出的 PRG,这在流密码中很常见,我认为您严重低估了完全映射 PRG 的所有可能输出所需的存储量。