为 GPG 密钥添加“随机数熵”?

IQA*_*eas 10 linux gpg random

在以下视频中:Linux HOWTO:使用 PGP 保护您的数据,第 2 部分,您将看到如何使用gpg. 在大约1:50,讲师说以下内容:

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

这在我看来就像一个神话,特别是因为命令行工具通常不应该受到光标的影响。另一方面,我不知道 Linux 的随机数生成器是如何工作的,无论它是由 GUI 共享还是独立于它。他声称的内容是否有任何库存,或者这是货物崇拜编程的一个例子?

Gil*_*il' 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 可能会在读取 from 时被阻塞/dev/random,等待内核的熵计数器上升。