代码之家  ›  专栏  ›  技术社区  ›  Nicholas Knight

熵源的安全混合

  •  4
  • Nicholas Knight  · 技术社区  · 14 年前

    假设我们正在生成非常大(例如128或256位)的数字作为分组密码的密钥。

    让我们进一步假设我们戴锡箔帽(至少在外面)。

    /dev/random 只是一点点 一致的(除了多疑之外,我们还很懒,不想手工生成所有的东西……)

    所以,让我们把它们都混在一起。

    在连接的字节上运行SHA-256是否足够?

    (是的,不久的某个时候,我将拿起一本密码工程。)

    4 回复  |  直到 14 年前
        1
  •  4
  •   Nick Johnson David Cournapeau    14 年前

    使用散列函数是一个很好的方法-只要确保低估了每个源贡献的熵的数量,这样,如果你正确地认为其中一个或多个不是完全随机的,你就不会过度地削弱你的密钥。

    这与在中使用的方法没有什么不同 key stretching

        2
  •  5
  •   hobbs    14 年前

    自从你提到 /dev/random --至少在Linux上, 是由一个算法提供的,这个算法和你描述的非常相似。它使用一个多项式函数将几个不同的可信任的熵源混合到一个“熵池”中——对于每一个新的熵字节,它被异或放入熵池中,然后用混合函数搅拌整个熵池。当需要从池中获得一些随机性时,使用SHA-1对整个池进行散列以获得输出,然后再次混合池(实际上还有一些散列、折叠和残缺,以确保反转过程与反转SHA-1一样困难)。同时,有一系列的计算正在进行——每次向池中添加一些熵,它值的熵位数的估计值就会被添加到帐户中,每次从池中提取一些字节,这个数字就会被减去,如果帐户低于零,随机设备将阻塞(等待更多的外部熵)。当然,如果您使用“urandom”设备,阻塞不会发生,池只是不断地进行散列和混合以产生更多字节,从而将其转换为PRNG而不是RNG。

    drivers/char/random.c linux-2.6

        3
  •  3
  •   Noon Silk    14 年前

    我以前做过这个,我的方法只是对它们进行异或运算,逐字节,相互比较。

    通过其他的算法运行它们,比如SHA-256,是非常困难的 效率低下,所以不实用,我认为这不会真正有用,也可能有害。

    Quantum Random Number Generator .

    FWIW,我认为我上面描述的方法(或类似的方法)实际上是 One-Time Pad 从任何一个来源的角度来看,假设其中一个是随机的,因此不可处理假设他们是独立的,并得到你。如果有人对此表示异议,我很高兴能得到纠正,我鼓励任何不表示异议的人无论如何都要提出质疑,自己去发现。

        4
  •  1
  •   Henri    14 年前

    最简单的算法是(改进的)van Neumann算法。您可以在此pdf中找到详细信息: http://security1.win.tue.nl/~bskoric/physsec/files/PhysSec_LectureNotes.pdf

    如果您对如何从给定的源中产生一致的随机性、真正的随机数生成器如何工作等感兴趣,我也建议您阅读本文档!