没有密码,RSA私钥就没有用了吗?

信息安全 加密 pgp RSA gnupg
2021-09-08 14:11:14

我注意到每当我生成一个新的 gpg 密钥(使用 pgp)时,我总是必须为其分配一个密码,这非常有意义。但如果我没记错的话,gpg 是基于素数的。这个密码是如何集成到私钥中的?如果有人窃取了私钥但不知道密码,那么所有加密数据仍然安全吗?

我假设主要问题是与暴力破解私钥相比,暴力破解密码是微不足道的?如果这是问题所在,那么即使您的私钥被泄露,拥有足够长的密码也能确保您的数据安全吗?

2个回答

您似乎要求对 GPG 如何生成密钥以及密码在此过程中扮演的角色有一个基本的了解。我将提供一些背景信息,然后在最后回答您的直接问题。

简短的回答是:每次您需要访问您的 RSA 私钥时,您的密码都被用作“种子”,以重新生成解密 RSA 私钥所需的 AES-256 密钥(请继续阅读以获取详细信息)。

RSA 密钥生成

生成 RSA 密钥时,您希望它尽可能随机,从操作系统的加密随机数生成器(/dev/random例如在 linux 上)中提取随机性根据 wikipedia/RSA_(cryptosystem)

必须使用一个加密的强随机数生成器,该生成器已经适当地植入了足够的熵,来生成素数 p 和 q

保护密钥文件

本问题所述在将 RSA 私钥保存到文件之前gpg使用其默认对称密码对其进行加密。Gpg的默认对称密码曾经是 3DES,但现在是 AES-256。如果您更愿意使用不同的密码,这也是可配置的(链接的问题有一个可用密码的列表)。

密码的作用

为了使用像 AES-256 这样的对称密码来加密您的 RSA 私钥,您需要一个 AES-256 密钥。不好了!递归!您如何以安全的方式存储密钥?答案是:你不需要 - 你每次需要它时都会使用密码作为种子生成。具体来说,它使用PBKDF2算法将您的密码拉伸成一个全长、外观随机的 AES-256 密钥。由于此 AES-256 密钥永远不会保存在任何地方,因此您的密码本质上是解锁您的 RSA 密钥的看门人。

为什么不直接将密码延伸到 RSA 密钥中呢?

我会把它放在这里只是因为这是一个显而易见的问题。

AES-256 或 3DES 等对称密码的密钥没有结构或属性,实际上任何长度正确的位串都可以用作密钥(分别为 256 位和 168 位)。

对于公钥密码(RSA、椭圆曲线、新的后量子密码,如 McEliece、NTRU 等),密钥需要具有非常特定的数学结构。例如,对于 RSA,私钥必须由两个素数和从它们派生的几个数字组成,因此,如果您将密码延长到正确的长度并尝试将其用作 RSA 密钥,则 99.99...% 的时间这将是一个无效的 RSA 密钥(即结果位不会是两个素数和相关值)。


回答您的直接问题:

1.

如果有人窃取了私钥但不知道密码,那么所有加密数据仍然安全吗?

我假设您的意思是“如果有人偷了私钥文件但不知道密码”。是的,您的数据是安全的。他们所拥有的只是一个加密文件,他们无法从中提取私钥。

但是,如果他们设法获得了您解密的私钥(例如从您正在运行的计算机的内存转储中),那么您就会陷入困境,该密码仅用于保护在磁盘上的私钥。

  1. 我假设主要问题是与暴力破解私钥相比,暴力破解密码是微不足道的?

是的,如果攻击者获得了您的加密密钥文件,那么他们猜测您的密码所需的猜测次数要比直接猜测您的 RSA 密钥要少。

一些数字

要准确估计破解 RSA-n 所需的猜测次数,其中 n 是1024、2048、4096等,很难找到,keylength.com可能是你能得到的最接近的,所以请用下面的数字取一个巨大的一粒盐。

假设一个1024 位 RSA 密钥为您(根据keylength.com)提供 72 位安全性,这意味着攻击者必须平均进行 2 72 次猜测才能破解您的 RSA 密钥。相比之下,使用数字、大小写的 12 个字符的密码提供 71.4 位的安全性[link to calc](攻击者必须进行大约 2 次71.4 次猜测)——假设它是完全随机生成的,如果它充满了字典单词,那么它比 71.4 位要弱得多。

使用所有 95 个可打印 ascii 字符的32 个字符的密码为您提供约 210 位的安全性[link to calc],几乎与完全随机的 AES-256 位密钥一样多。虽然 RSA-8192 密钥仅提供 136 位的安全性,但使用足够长且足够随机的密码,您的密码实际上可以比它所保护的 RSA 密钥更强(真的吗?!)。

密码不是密钥的一部分,而是用于加密私钥。从技术上讲,密码被输入到密钥拉伸算法中,该算法的输出用于加密私钥。

保护密码的策略是:

  1. 使密码长而强。
  2. 尽可能减慢关键拉伸算法的速度。这个答案描述了一些你可以传递给 GPG 的命令行参数来实现这一点。

这个说法:

如果这是问题所在,那么即使您的私钥被泄露,拥有足够长的密码也能确保您的数据安全吗?

如果你的私钥被泄露,游戏就结束了。但是我认为您是在问,如果包含您的私钥的加密副本的文件遭到破坏,会发生什么。在这种情况下,用户必须破解密码才能恢复私钥。这就是为什么强密码和缓慢的密钥拉伸操作很有帮助的原因。