62

从我通过阅读各种材料了解到的任何一点点来看,公私钥对是非对称加密的基础,也是选择 2 个素数(大致是您的私钥)并将它们相乘(大致是您的公钥)的基础。在我看来,如果您知道私钥,则可以生成公钥。这是正确的还是我弄错了什么?

让我更困惑的是,仅使用私钥(使用 .NET 类 RSACryptoServiceProvider)无法将 RSA 密钥序列化为 XML 。不确定此限制是否是故意的!

4

10 回答 10

55

在大多数非对称密码系统实现中,唯一可以确保的事实是您无法从公钥中找到私钥。反过来,在大多数情况下,从私钥中找到公钥是微不足道的。

例如,在 RSA 中,您可以使用以下方法从私钥创建公钥:

openssl rsa -in private.pem -pubout -out public.pem

具有误导性的是术语:“私钥”是指两个不同的概念,无论您是在谈论理论,还是在谈论实际实施:

  • 理论上的私钥是与 (e, n) 共享完美对称(数学)关系的一对(d, n )。如果您正在比较这些,则无法从另一个计算得出。
  • 实用的私钥(例如在 openssl 实现中)指的是一个包含(d, n)的文件,但也包含几个用于解码速度目的的重要中间值。除此之外,公钥e的理论上“未知”部分通常按照惯例固定为常用值(0x10001默认情况下在 openssl 中,尽管可以更改,但强烈建议仅使用非常具体的值) . 因此,从私钥推导出公钥(e, n)是微不足道的,原因不止一个。
于 2009-09-03T12:22:13.717 回答
41

这取决于加密系统。

RSA中,我们有(引用维基百科):

公钥由模数 n 和公开(或加密)指数 e 组成。私钥由模数 n 和必须保密的私钥(或解密)指数 d 组成。

现在,如果我们有 n 和 d(私钥),我们只缺少 e 作为公钥。但 e 通常相当小(小于三位数),甚至是固定的(常见值为 65537)。在这些情况下,获取公钥是微不足道的。

对于Elliptic Curve Diffie-Hellman,私钥是 d,公钥是 dG(G 也是公开的),所以它也很简单。

于 2009-03-30T09:22:48.670 回答
9

这取决于算法,以及“私钥”的含义。

RSA 私钥通常以“中国剩余定理”的形式存储。例如,RSAPrivateKey在 PKCS #1 中定义并被许多其他加密标准重新使用的结构采用这种形式。这种形式包括两个通常用p和表示的秘密数字q,从中可以计算出总金额。使用 totient 和私有指数,可以快速计算公共指数。

在任何情况下,大多数 RSA 密钥对都使用 65537 作为公共指数,并且模数始终作为私钥的一部分携带。

于 2009-04-02T22:57:56.277 回答
6

在任何公钥密码系统中,公钥在数学上都与私钥相关。这很简单。

公钥是在生成时从私钥派生的,并且在将来的任何时候使用私钥都可以轻松地重新派生公钥。

走另一条路是不可行的。给定一个公钥,导出私钥并不容易。这就是为什么我们可以安全地与其他人共享公钥。如果你有足够的时间/CPU 周期,你可以暴力破解它,但等待对密钥的数学攻击可能更容易。

于 2009-03-30T09:27:18.940 回答
5

对私钥是什么存在误解。私钥只是 (d,n) 对,仅考虑到这一点,从它生成公钥是不可行的,除非您可以假设公钥是 65537,几乎所有 rsa 密钥都是这种情况。

如果出于任何原因,公共指数是一个更大的数字,则您无法从私有指数创建公共密钥。

也就是说,存储为 pem 文件的“私钥”的值不仅是私钥,还包含主要因素(除其他外),因此很容易从中生成公钥。

于 2017-03-24T05:52:08.380 回答
3

对于 OpenSSH 和ssh-keygen的特定情况,是的,您可以

ssh-keygen -y

此选项将读取私有 OpenSSH 格式文件并将公钥打印到标准输出。


通常,这取决于算法和您标记私钥的内容。但是,任何明智的实现都会在秘密文件中包含完整的信息(公钥和私钥)。

于 2012-08-21T14:40:33.650 回答
1

是的,可以使用私钥获取公钥。可以使用openssl来完成。请参考以下命令以使用私钥获取公钥。

openssl rsa -in privatekey.pem -pubout

Please refer this screenshot : Fetch public key using private key

于 2021-07-05T08:25:03.063 回答
0

是的,通过访问私钥,可以生成公钥

于 2009-03-30T08:59:04.640 回答
0

公钥是模数 N(和公共指数 e,通常为 65537),私钥由两个素数 p、q(和私人指数 d,有时还有 CRT 部分 d_p、d_q 用于加速)给出,基本上你有 N=pq 和 e d=1 mod ((p-1) (q-1)),您还可以使用给定私钥的 CRT 计算 d_p 和 d_q,公钥模数的计算是“无聊”乘法,公共指数在规范中或使用扩展计算如果标准 e 不够好,则使用 euclid 算法。给定公钥,私钥的计算需要找到 d(RSA 问题)或 p,q(因式分解,请参阅数字字段筛以获得最佳算法)。这些问题在合理的条件下被证明是等价的 [Breaking RSA Generically is Equivalent to Factoring, D. Aggarwal and U. Maurer, 2008]

于 2016-01-25T15:44:39.630 回答
-3

这在理论上是可能的,但对于大密钥在计算上是不可行的。

于 2009-03-30T08:58:41.753 回答