SSH 私钥是否总是包含足够的信息来派生公钥?

信息安全 公钥基础设施 SSH
2021-08-28 10:57:15

我正在研究 SSH 私钥的持久性模型。使用的技术是Java。由于公钥和私钥的持久性结构非常相似,并且使用了一些 Java API,例如java.security.interfaces.RSAPrivateCrtKey,我能够派生公钥。

所以这让我想知道是否只保留私钥就足够了,然后从中导出公钥?

我相信这可以归结为几个我想得到答案的重要问题:

  1. 我是否总是可以从私钥获取创建公钥所需的信息/元数据。例如,在 RSA 的情况下,Java API 似乎提供了模数和公共指数。
  2. 重新创建的信息是否总是相同的?
  3. 如果我将 SSH 私钥作为文件获取,是否有可能它不包含公钥相关信息。
1个回答

这个问题有三个方面,一般是 RSA,带有 SSH 的 RSA 和带有其他密码系统的 SSH。

在 RSA 中,公钥和私钥在理论上都由两个值组成。

  1. 模数,这对于公钥和私钥都是通用的。
  2. 指数,公钥有一个单独的公共指数,私钥有一个私人指数。

所以理论上 RSA 私钥不必包含公钥。然而在实践中。

  1. 大多数实用的私钥格式都包含附加信息。它们通常包括公共指数,因为能够从私钥文件创建公钥文件实际上很有用。它们通常还包括原始 p 和 q 值以及一些额外的派生值,以加快私钥操作。
  2. 公钥指数通常是少数众所周知的值之一。在大多数 RSA 密钥上,即使您拥有模数和私有指数,通过反复试验也不难计算出公共指数。

根据http://blog.oddbit.com/2011/05/08/converting-openssh-public-keys/ openssh 使用 pkcs#1 私钥格式。根据https://www.rfc-editor.org/rfc/rfc3447#appendix-A.1.2这种格式包含模数、公共和私有指数、素数和许多其他对优化私钥有用的值操作。包括公钥信息似乎不是可选的。

因此,对于 RSA,您很好,因为您已经发现您可以轻松地将公钥参数从私钥结构中提取出来。

对于带有 ECDSA 的 SSH,似乎公钥参数通常不会作为私钥的一部分存储,但可以很容易地从中导出。https://stackoverflow.com/questions/12480776/how-do-i-obtain-the-public-key-from-an-ecdsa-private-key-in-openssl

YMMV 与其他密码系统。