Random 熵源的安全混合

Random 熵源的安全混合,random,cryptography,entropy,Random,Cryptography,Entropy,假设我们正在生成非常大(例如128或256bit)的数字作为分组密码的密钥 让我们进一步假设我们戴着锡箔帽(至少在户外) 由于如此偏执,我们想要确定我们的可用熵,但我们并不完全信任任何特定的来源。也许政府在操纵我们的硬币。也许这些骰子的重量太小了。如果馈送到/dev/random的硬件中断有点太一致怎么办?(除了多疑之外,我们还很懒,不想手工生成所有这些内容……) 所以,让我们把它们都混在一起 执行此操作的安全方法是什么?可能仅仅从每个源中连接几个字节并不完全安全——例如,如果其中一个源有偏差,

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

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

由于如此偏执,我们想要确定我们的可用熵,但我们并不完全信任任何特定的来源。也许政府在操纵我们的硬币。也许这些骰子的重量太小了。如果馈送到
/dev/random
的硬件中断有点太一致怎么办?(除了多疑之外,我们还很懒,不想手工生成所有这些内容……)

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

执行此操作的安全方法是什么?可能仅仅从每个源中连接几个字节并不完全安全——例如,如果其中一个源有偏差,理论上它可能会导致相关的密钥攻击

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


(是的,很快我就要拿起一本密码工程。:)

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

通过其他一些算法运行它们,比如SHA-256,效率非常低,因此不实用,我认为这不会真正有用,也可能有害

如果你碰巧是一个难以置信的偏执狂,并且有一点点钱,那么买一个“真的”(取决于你被量子力学说服的程度)a可能会很有趣

--编辑:


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

使用哈希函数是一种很好的方法-只要确保你低估了每个源所贡献的熵,因此,如果您正确地认为其中一个或多个不是完全随机的,那么您并没有过度削弱您的关键点


这与中使用的方法没有什么不同(尽管这里不需要多次迭代)。

如果你有随机性的来源,但你不确定它是否有偏差,那么有很多不同的算法。根据你想做多少工作,你从原始来源浪费的熵是不同的

最简单的算法是(改进的)van Neumann算法。您可以在此pdf中找到详细信息: 在第27页


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

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


无论如何。。。它实际上很有趣,评论也很好——你可能想研究一下
drivers/char/random.c
linux-2.6
树中。

当我们戴着锡帽时:SHA只是一个NSA拥有密钥的加密方案。@cobbal虽然有点滑稽,但它显然是不正确的,因为任何哈希方案都固定了输出大小,所以它不可能是一个“加密”方案,因为不可能把所有东西都拿回来。另外,你会把人们混淆在散列和加密之间,这是不理想的:)抱歉,没有幽默感。取任何最随机的源,用你能得到的最精确的时间表示对结果进行异或运算-听起来不错(一个非密码学家…:))@cobbal:在这一点上,我不信任SHA或其他一些已知的哈希算法,我真的不应该信任任何其他加密算法。我不是密码学家,但在我看来,熵产生往往是真正的弱点。即使许多“坏”算法在实践中也足够好,例如,需要选择的明文数量非常多,但糟糕的熵生成甚至可以杀死最安全的算法。虽然我相信它可能是最安全的,但你的方法需要从每个源生成n位的n位密钥,对吗?你能澄清一下SHA-256是如何“极度低效”的吗?密钥生成是一次性(或至少很少)事件。关于通过散列创建密钥可能造成的危害的一些信息也很好……尼古拉斯:模拟你的威胁。考虑这一点,哈希是一个确定性函数。那么你希望它能实现什么呢?向谁隐瞒什么?如果只是为了生成密钥,那么您的问题是密钥存储。如果有人仍然可以看到,散列密钥没有任何区别,是吗?你是第一个qs,我没注意到这是