为GPG键添加“随机数熵”?


10

在下面的视频中:Linux HOWTO:使用PGP保护数据,第2部分,显示了如何使用创建密钥对gpg。大约在1:50,讲师说:

生成密钥时,最好将鼠标稍稍移动一下,以便为创建密钥对提供更多的随机数熵。

在我看来,这就像是一个神话,尤其是因为命令行工具通常不应受到光标的影响。另一方面,我不知道Linux的随机数生成器是如何工作的,无论它是由GUI共享还是独立于GUI。他声称有什么存货,还是这是一个货运崇拜计划的例子?


作为附带问题,这是否是对“城市神话”的正确使用,还是“计算中的神话”有类似的用语?
IQAndreas

1
我认为这是城市传说 ; 我从未听说过都市神话。请参阅en.wikipedia.org/wiki/Urban_legend在计算中,短语“ cargo cult”可能是合适的。
derobert 2014年

Answers:


8

这样做有一定道理,实际上比神话还重要,但尽管如此,该声明还是对正在发生的事情有根本的误解。是的,在使用GPG生成键时移动鼠标可能是一个好主意。是的,移动鼠标会产生一些熵,使随机数成为随机数。不可以,移动鼠标不会使按键更安全。

所有适用于密码学的良好随机生成器,而Linux属于该类别,具有两个组件:

  • 不确定性的源。熵的目的是用不可预测的数据引导随机数生成器。熵源必须是不确定的:否则,对手可能会重复相同的计算。
  • 一个伪随机数生成器,它根据内部状态的变化以确定性的方式生成不可预测的随机数。

熵必须来自计算机外部的来源。用户是熵的一种来源。用户所做的大部分不是随机的,但是击键和鼠标移动的良好时机是如此难以预测,以至于有些随机-不是很随机,而是一点一点地积累。熵的其他潜在来源包括网络数据包的定时以及相机或麦克风的白噪声。不同的内核版本和配置可能使用不同的资源集。一些计算机具有基于放射性衰变的专用硬件RNG电路,或者基于不稳定的电子电路(不那么令人印象深刻)。这些专用源在嵌入式设备和服务器中特别有用,这些设备和服务器在首次启动时可以具有相当可预见的行为,而无需用户做任何奇怪的事情。

Linux通过两个设备为程序提供随机数:/dev/random/dev/urandom。从任一设备读取将返回加密质量。两种设备都使用相同的内部RNG状态和相同的算法来转换状态并生成随机字节。它们具有特殊的局限性,这使得它们都不是正确的事情:

  • /dev/urandom 如果系统尚未累积足够的熵,则可以返回可预测的数据。
  • /dev/random计算可用熵的数量,如果不够,则进行阻塞。这听起来不错,除了计算是基于理论上的考虑,这些理论使可用熵的数量随每个输出位线性减小。因此/dev/random往往会很快阻塞。

Linux系统将内部RNG状态保存到磁盘并在启动时将其还原。因此,熵会从一个引导转移到另一个引导。刚安装Linux系统时,唯一可能缺少熵的地方是。一旦系统中有足够的熵,熵就不会减少;只有Linux的错误计算减少了。有关此注意事项的更多说明,read /dev/urandom适合由专业密码学家生成密码密钥。参见aso 可以解释random.c中使用的熵估计

移动鼠标会增加系统的熵。但是GPG只能读取/dev/random,不能/dev/urandom(一种方法来解决这个问题,使/dev/random同样的1:9装置/dev/urandom),所以这是从来没有在接收未随机足够的随机数的风险。如果您不移动鼠标,则该键将尽可能随机。但是可能发生的是,gpg可能在读取时被阻塞/dev/random,等待内核的熵计数器上升。


除非经过我的测试,当前版本的linux至少不使用输入设备作为熵(或至少是估计的熵)来源。我很确定他们改变了这一点,因为从理论上讲,它们可能在攻击者的控制之下。
derobert 2014年

@derobert从3.12开始,有add_input_randomnessin 的调用drivers/input/input.c,但是我不知道它在什么情况下实际上会注入熵。
吉尔斯(Gilles)'所以

我猜它会增加熵,但是估计为0 ...我尝试了USB鼠标和PS / 2键盘,但似乎都没有达到熵估计。但是,不知道为什么,正如我在代码中看到对credit_entropy_bits的调用一样。
derobert 2014年

3

GPG正在使用Linux(内核)随机数生成器。内核生成器从各种地方获取熵(随机性),其中包括某些中断的中断时间。移动鼠标(以及键入,磁盘活动等)都会产生中断。

因此,移动鼠标确实确实有可能馈入随机数生成器。但是,是否确实取决于所使用的确切内核版本。较新的版本(至少在我的测试中)不使用键盘或鼠标中断来获取熵。但是,磁盘活动确实如此(因此,例如,运行sync将增加潜在的大量熵,具体取决于刷新的量)。

简而言之:在当前的Linux版本上不是这样。它是在较旧的。

但是,如果生成器的熵用完了,应该停止运行,因此您的密钥生成将挂起,直到生成一些熵为止。因此,这将是一个永远解决的问题,而不是安全问题。

您可以通过看到多少熵cat /proc/sys/kernel/random/entropy_avail


还要注意,您可以使用诸如rngd人工输入熵池之类的工具。
Patrick

@Patrick确实如此,如果您有新芯片并且信任NSA(哦,等等,我的意思是Intel),则可以使用RDRAND。
derobert 2014年

haveged它是人为地补充熵池的另一个很好的工具。
mavillan 2014年

这还不是完整的故事– RNG不会耗尽熵,它会耗尽其内部熵。另外,难题的重要组成部分是gpg不在乎鼠标,而是内核在乎。
吉尔斯(Gillles)“所以-别再邪恶了”

@Gilles我已经澄清了gpg正在使用Linux RNG。熵估计器中的错误似乎超出了范围。
derobert 2014年

0

由于Tails已haveged安装,因此生成密钥的速度非常快:

sudo apt-get install haveged
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.