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

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

在下面的视频中:Linux HOWTO:使用 PGP 保护您的数据,第 2 部分,您将看到如何使用 创建密钥对gpg。大约 时1:50,讲师说了以下内容:

在生成密钥时,最好移动鼠标一点点给它更多的随机数熵来创建密钥对。

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

答案1

这有一定道理,事实上比神话更真实,但尽管如此,这种说法反映了对正在发生的事情的根本误解。是的,在使用 GPG 生成密钥时移动鼠标可能是个好主意。是的,移动鼠标会产生一些熵,使随机数变得随机。不,移动鼠标并不会使密钥更安全。

所有适合密码学的优秀随机生成器(Linux 就属于此类)都具有两个组件:

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

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

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

  • /dev/urandom如果系统尚未积累足够的熵,则可以返回可预测的数据。
  • /dev/random计算可用熵的数量并在没有足够的情况下进行阻止。这听起来不错,只不过计算是基于理论考虑,使得可用熵的量随着每个输出位线性减少。因此/dev/random往往会很快阻塞。

Linux 系统将内部 RNG 状态保存到磁盘并在启动时恢复。因此,熵会从一只靴子转移到另一只靴子。 Linux 系统可能缺乏熵的唯一情况是在新安装时。一旦系统中有足够的熵,熵就不会减少;只有Linux的有缺陷的计算减少了。有关此考虑因素的更多解释,请阅读/dev/urandom适合生成加密密钥,由专业密码学家。参见阿苏你能解释一下 random.c 中使用的熵估计吗

移动鼠标会给系统增加更多的熵。但gpg 只能读取/dev/random,不能/dev/urandom(解决这个问题的一个方法是制作/dev/random/dev/urandom),因此它永远不会面临接收不够随机的随机数的风险。如果你不移动鼠标,按键是尽可能随机的;但可能发生的情况是 gpg 可能会被阻止在读取中/dev/random,等待内核的熵计数器上升。

答案2

GPG 使用 Linux(内核)随机数生成器。内核生成器从各个地方获取熵(随机性),其中包括对于某些中断的中断时序。移动鼠标(以及打字、磁盘活动等)都会产生中断。

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

简而言之:在当前的 Linux 版本上情况并非如此。这是在较旧的身上。

但是,如果生成器耗尽了熵,它应该会停止,因此您的密钥生成将挂起,直到生成一些熵。所以这将是一个永久性的问题,而不是安全问题。

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

答案3

Tails 的密钥生成速度非常快,因为它haveged安装了:

sudo apt-get install haveged

相关内容