SSH - 如果 Eve 有密码和公钥,她可以导出私钥吗?

信息安全 密码学 SSH 蛮力 密码分析 算法
2021-08-28 00:01:49

我已用于ssh-keygen创建 RSA 4096 位 SSH 私钥和公钥对。我为私钥使用了密码。

如果攻击者 Eve 知道除了公钥之外的密码:

  1. 他们可以导出私钥吗?- 我认为有足够的时间。
  2. 如果他们可以导出公钥,他们可以使用什么算法来做到这一点?- 我不知道。
  3. 每个算法派生私钥所需的操作数量(或顺序)是多少?

更新 - 似乎在一台计算机上使用“yafu”(http://iamnirosh.blogspot.co.uk/2015/02/factoring-rsa-keys.html),蛮力破解过程/分解所需的时间明显减少.

  • 看看 yafu 在分布式环境和超级计算机上有何不同会很有趣。
4个回答

私钥与密码短语无关。公钥也是如此。公钥通常也未加密存储,即使私钥受密码保护。(在公钥以加密形式存储的情况下可能存在例外情况,但在基本情况下并假设密钥足够大,这样做不会提供额外的安全性,因为公钥旨在公开分发或至少可以假设为对手可用。)

现在,不要误会我的意思。使用密码保护您的私钥是一个非常好的主意,并且这样做是最佳实践。私钥和公钥彼此具有数学关系。但是你的私钥仍然只是一个数字。此数字与您用来加密包含此数字的文件的密码短语无关,密码短语的作用就是如此。

如果攻击者 Eve 除了知道公钥之外还知道密码;他们可以推导出私钥吗?- 我认为有足够的时间。

公钥与私钥在数学上是相关的,简单的答案是肯定的,只要有足够的时间,理论上可以从另一个推导出来。几乎按照定义,公钥需要以明文形式传输,以便在建立加密通信通道之前建立身份,所以 Eve(按照惯例 Eve 是被动窃听者;Mallory 是中间的主动人)可以看到它。

从 RSA 中的私钥派生公钥很容易。从公钥导出私钥在计算上被认为是不可行的,并且对于足够大的密钥实际上是不可能的。据我们所知,没有快速的方法可以从经典计算机上的 4096 位公共 RSA 模数导出私有 RSA 密钥数据(这是我们目前拥有的)。即使是对 2048 位公共 RSA 模数的有效攻击也将是一项壮举,尽管 1024 位 RSA 在合理的时间内是可行的,并且768 位 RSA 私钥已被考虑在内(它花了在相当现代的硬件上相当于大约 2,000 个 CPU 年)。

所以,“有足够的时间”,这是可能的。但这与密码短语或缺少密码短语无关。

为了理解上述原因,为了简单起见,我将使用教科书 RSA。(现实世界的 RSA 与教科书 RSA 相似,但不完全相同,因为有许多现实世界的攻击是教科书 RSA 无法处理的。)这里,在其他一些数字中,私钥是一对质数通常称为pq,公钥是它们的乘积,n = pq,其中n称为公共模数给定pq,计算n是微不足道的(你只需要将两个 - 非常大 - 数字相乘),但只给出n,确定pq的对应值是极其困难的。但是,我们没有证据证明确实如此;只是没有任何公开的简单方法可以实际做到这一点,即使有很多非常聪明的人已经在这个问题上工作了很长时间。这就像计算出 15 = 3 * 5,只是所涉及的数字不是几位数,而是数百位数。对于一阶近似值,对于 4096 位 RSA 密钥,n的长度约为 1300 个十进制数字,而pq的长度分别略大于 600 个十进制数字。我们可以看到这一点,因为 log 10 (2 4096 ) ≈ 1233 和 10 615 * 10 615  = 10 1230

如果他们可以导出公钥,他们可以使用什么算法来做到这一点?- 我不知道。

半素数分解算法。大于 10 100(100 个十进制数字,大约 332 位)的数字的当前技术状态是通用数字域筛选(GNFS) 算法。

量子计算机可以使用Shor 的算法来有效地分解半素数,但是(至少在公开场合)我们还不知道如何构建一个足够大的可以实际工作的量子计算机。这就是推动所谓的后量子密码学的一部分内容。上次我听说,最先进的技术是考虑数字 15,但那是几年前的事了。众所周知,量子计算机现在可能能够分解大于 15 的数字。

每个算法派生私钥所需的操作数量(或顺序)是多少?

使用 GNFS 分解数字的复杂性在其 Wikipedia 页面上进行了讨论。直接讨论操作数确实很难,但是在对先决条件进行了一些讨论之后,维基百科的文章总结说,数字字段筛的运行时间是超多项式的,但在输入的大小上是次指数的。您可以比较用于各种RSA 数字的各种因式分解时间和算法,这是 1990 年代初开始的竞赛的一部分,旨在扩展与整数分解相关的知识,现在已不活跃。

也比较一下,观察正在建立的 HTTPS 连接的人怎么可能不知道如何解密它?请注意,HTTPS 与 SSH 的工作方式不同,但基本操作原理仍然相似。

密码可防止访问私钥

密码短语旨在在物理访问时保护私钥如果黑客可以登录到您的服务器并可以访问您的证书存储,他可以使用密码获取包含私钥的证书副本希望黑客不会经常访问您的证书存储,但有时黑客只是心怀不满的员工。

公钥算法可防止导出私钥

如果黑客无权访问您的证书存储,并且只有密码和公钥,则无法派生私钥。这是由于 RSA 算法设置的巧妙方式。从私钥到公钥的关系是一个陷阱门函数,这意味着它很容易在一个方向上计算,但在另一个方向上却不行。

这是一个例子。如果我告诉你 X * Y = 3014569,并且 X 和 Y 是整数,你能告诉我 X 还是 Y?这将是非常困难的(因为我选择 X 和 Y 的方式)。另一方面,如果我告诉你 X = 1237 和 Y = 2437,你很容易告诉我 X * Y = 3014569(你只需要相乘!)所以一方面容易,另一方面很难大大地。这被称为素数分解问题。

话虽如此,他可能会花几千年的时间一遍又一遍地穿过活板门来找到你的私钥。像这样:

  1. 遍历所有可能的私钥
  2. 对于每个私钥,派生公钥
  3. 对照目标公钥检查计算出的公钥

这称为蛮力攻击。这需要很长时间。

可能有一些捷径(例如使用量子计算机),数学家总是想出新的方法来解决这样的问题。但就目前而言,4096 位密钥被认为可以持续到可预见的未来(有关详细信息,请参阅此链接)。

可能有可能从公钥中派生出您的私钥(只是认为没有人知道如何有效地做到这一点),但密码短语根本无济于事。

您应该了解 ssh-keygen 首先生成与密码完全无关的密钥 par,然后密码仅用于加密磁盘上的私钥。因此,密码仅对知道您的加密私钥的人有用。

顺便说一句,您可以在不更改公钥的情况下更改私钥的密码(带ssh-keygen -p)。

他们可以推导出私钥吗?- 我认为有足够的时间。

密码短语仅用于加密客户端系统上的私钥存储,因此仅当他们拥有加密的私钥文件时才有用。所以这归结为攻击者是否可以从公钥中导出私钥。

答案取决于密钥的类型和长度以及它们可用的计算资源。

对于 RSA 密钥,最好的破解方法是分解模数。一旦模因数被分解,那么从模数因数重新导出私钥就很简单了。

最著名的因式分解算法是通用字段数筛。768 位数的因式分解已被公开证明。1024 位数的因式分解尚未公开展示,但被认为对于间谍机构和类似资源的组织是可行的。2048 位 RSA 应该是安全的,除非因式分解技术取得重大进展或找到攻击 RSA 的替代方法。4096 位是偏执狂的又一进步。

请注意,我们不能绝对声明即使是 4096 位密钥也是安全的。仍然有可能在因式分解算法方面取得突破,或者找到另一条攻击 RSA 的途径。

对于传统的 DSA,最知名的攻击途径涉及解决模素数域上的离散对数问题。事实证明,最知名的算法也是通用字段数筛,但将该算法应用于离散对数问题比将其应用于素因子分解问题更难。图 1024 位 DSA 密钥比 1024 位 RSA 密钥更难破解,但可能并非完全不可行。

对于椭圆曲线 DSA,最知名的攻击途径涉及解决椭圆曲线场上的离散对数问题。这被认为比在模素数域上解决它要困难得多,因此对于给定的假定安全级别,密钥可以更短。