想象一下,您即将玩一个涉及使用骰子的棋盘游戏,比如 Monopoly、Yahtzee、Cluedo、Dungeons & Dragons...1 在大多数情况下,至少在您有兴趣玩公平游戏的情况下,您希望非常确定骰子结果是随机分布的。换句话说,对于一个六面骰子,您希望每次掷骰子时,从一到六的任何数字都有均等的机会出现。这似乎是一个相当简单的事情,而且,像许多乍一看很简单的事情一样,数学家们已经设法围绕它构建了一个完整的研究领域,使其过程变得极其复杂。4
让我们转向计算机。与棋盘游戏相反,您通常希望计算机每次在您要求它执行操作时都执行相同的操作,假设您给它相同的输入:您希望当呈现相同的初始条件时,它的行为是确定性的。随机行为通常对计算机来说不是一件好事。当然,这个规则也有例外,例如当您想使用计算机玩游戏时,如果游戏玩法没有变化,事情很快就会变得无聊。
还有另一个大的例外:密码学。但并非所有密码学都是如此;在几乎所有情况下,您肯定希望在同一密钥下将单个明文加密为单个密文。但是,有一个领域随机性很重要,那就是创建您将用于执行这些操作的密码学密钥。事实证明,您需要有相当多的随机性才能创建一个唯一的密钥——而且密钥确实需要是真正唯一的。如果您没有足够的随机性,不仅您可能会重复生成相同的密钥(或密钥集),而且其他人也可能这样做。如果他们可以猜到您正在使用的密钥,他们就可以做一些事情,例如阅读您的消息或冒充您。
鉴于这些正是密码学试图阻止的事情,因此显然重要的是您拥有大量的随机性。
幸运的是,数学家和物理学家前来拯救我们。他们用“熵”这个词来表示随机性。事实上,数学家和物理学家在谈论熵时(就我所知)意味着比仅仅是随机性更深刻和复杂的问题。但是,如果我们能找到一个好的熵源并将其转换为计算机可以使用的东西,我们应该有足够的随机性来完成我们想用密码学密钥生成做的所有事情。5 上句话中的问题是“如果”和“应该”。
首先,我们需要找到一个好的熵源并证明它是好的。关于这一点的好处是,实际上有很多天然的熵源。计算机周围的气流通常足够随机,以至于可以测量温度变化,从而提供足够好的熵。人与外围设备(如鼠标移动或键盘敲击)的交互可以提供更多的熵。过去,网络数据包接收时间之间的差异被使用,但人们开始担心这些实际上不如以前认为的那么随机,并且可能被外部方测量到。6 有一些算法允许我们测量熵源的随机性——尽管它们当然无法预测未来的随机性。
但是,假设我们有一个好的熵源。或者,让我们假设我们有几个相当好的熵源,并且我们相信当我们把它们组合起来时,它们作为一个整体会足够好。
这通常是计算机和操作系统所做的事情。他们从各种熵源收集数据,然后将其转换为比特流——您计算机最喜欢的 1 和 0 语言——然后可以用来提供随机数。当他们做得不够好时,问题就出现了。
发生这种情况的原因有很多,主要原因是错误的采样和错误的组合。即使您的熵源良好,如果您没有以适当的方式对其进行采样,那么您获得的结果将无法反映该熵源的“良好性”;这是一个采样问题。这已经够糟糕了,但是组合算法应该可以消除这类问题,前提是它不太糟糕并且您有足够的熵源。
但是,当您有一个算法没有这样做,或者甚至没有很好地组合采样良好的源时,您就遇到了真正的问题。而且,我们知道,算法并非总是正确实施。甚至有指控称,一些政府安全部门已将弱化的算法(其弱点只有他们知道并且可以利用)引入到世界各地的系统中。在专有和开源世界中,都出现了一些非常引人注目的实施不力示例,这些示例已导致实际部署中的实际问题。至少当您有一个开源实现时,您有机会修复它。
当这些算法嵌入到硬件中(例如主板上的芯片)时,问题会更加复杂。在这种情况下,它非常难以修复,因为您通常无法仅仅更换所有受影响的芯片,并且可能也很难追踪。但是,无论您是在硬件还是软件中操作,在相当长一段时间内都没有发现不良算法的影响是,您可能拥有数百万个弱密钥,这些密钥在保护身份或私人数据方面做得非常糟糕。即使您设法替换了这些密钥,那么如果记录下来,现在可以读取的所有历史加密又该怎么办?如果我可以伪造几年前签署房屋交易的人的身份,使其看起来像我现在拥有它,该怎么办?
因此,熵可能难以管理,并且当我们遇到问题时,该问题的影响可能比我们立即想象的要大得多。
3 我曾经是地下城主!
5 以及游戏。
6 另一种良好的熵来源是通过测量放射性衰变获得的,但您通常不希望坚持要求计算机或其人类操作员需要足够靠近它们的放射源才能有用。
本文最初发表于Alice, Eve, and Bob—一个安全博客 并经许可转载。
评论已关闭。