我注意到每当我生成一个新的 gpg 密钥(使用 pgp)时,我总是必须为其分配一个密码,这非常有意义。但如果我没记错的话,gpg 是基于素数的。这个密码是如何集成到私钥中的?如果有人窃取了私钥但不知道密码,那么所有加密数据仍然安全吗?
我假设主要问题是与暴力破解私钥相比,暴力破解密码是微不足道的?如果这是问题所在,那么即使您的私钥被泄露,拥有足够长的密码也能确保您的数据安全吗?
我注意到每当我生成一个新的 gpg 密钥(使用 pgp)时,我总是必须为其分配一个密码,这非常有意义。但如果我没记错的话,gpg 是基于素数的。这个密码是如何集成到私钥中的?如果有人窃取了私钥但不知道密码,那么所有加密数据仍然安全吗?
我假设主要问题是与暴力破解私钥相比,暴力破解密码是微不足道的?如果这是问题所在,那么即使您的私钥被泄露,拥有足够长的密码也能确保您的数据安全吗?
您似乎要求对 GPG 如何生成密钥以及密码在此过程中扮演的角色有一个基本的了解。我将提供一些背景信息,然后在最后回答您的直接问题。
简短的回答是:每次您需要访问您的 RSA 私钥时,您的密码都被用作“种子”,以重新生成解密 RSA 私钥所需的 AES-256 密钥(请继续阅读以获取详细信息)。
生成 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 密钥的看门人。
我会把它放在这里只是因为这是一个显而易见的问题。
AES-256 或 3DES 等对称密码的密钥没有结构或属性,实际上任何长度正确的位串都可以用作密钥(分别为 256 位和 168 位)。
对于公钥密码(RSA、椭圆曲线、新的后量子密码,如 McEliece、NTRU 等),密钥需要具有非常特定的数学结构。例如,对于 RSA,私钥必须由两个素数和从它们派生的几个数字组成,因此,如果您将密码延长到正确的长度并尝试将其用作 RSA 密钥,则 99.99...% 的时间这将是一个无效的 RSA 密钥(即结果位不会是两个素数和相关值)。
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 密钥更强(真的吗?!)。