我可以从 RSA 私钥中获取公钥吗?

信息安全 公钥基础设施 RSA
2021-08-12 09:33:32

据我所知,您使用公钥加密消息并使用私钥解密。我的问题是是否可以从 RSA 私钥中获取公钥。例如,如果我有这样的钥匙:

-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQCtrKVnwse4anfX+JzM7imShXZUC+QBXQ11A5bOWwHFkXc4nTfE
Or3fJjnRSU5A3IROFU/pVVNiXJNkl7qQZK5mYb8j3NgqX8zZJG7IwLJ/Pm2sRW5Q
j32C/uJum64Q/iEIsCg/mJjDLh1lylEMEuzKgTdWtoeLfxDBL2AJ20qXzQIDAQAB
AoGBAKNXi0GpmjnCOPDxLFg5bvQVfhLSFCGMKQny1DVEtsfgZmbixv5R2R41T4+d
CHJMdEsUFFJ6I7CRLTcg1SDU8IhcAWCBRSNeVuomCHlQG16ti8HxwhiwIcjvDz/z
NC2sL5ZJ2eJnhbtXLdf6pxxO1pA5vLp1AX06IaETO977XvupAkEA+ZgtGZybyUkf
tEA3ekXc5eLoW+zgU0C1fATWcIZ8Iq5YV1BW+3oAzf8HgIbkQh4LM2qa6An3l+vW
NXR4wICHkwJBALIhrcdJqKw36qiyenq+m78klp5SnurQifVt0Sy1GMWyOUqYz5jK
t9sGo9Qn6GDuYe/XGXKWQW25PkEYXxxPPx8CQQCpICyvRidp5VrOURVGjUB5pZ+9
am02/In9V2nXJcnH1kuWHqJSFQGmlEEJHl5dTu5YEMyWnupezzd/UUThbDZxAkAz
TNO5QxNalbf04YG4e9Bq2eSur+iog2pXzkqhb3404UDypNOUkz0jzOO9o8ieschu
xCnGAFPTf7fYE2bAxmnNAkEA0/3bdsvJclquypqP9CQeQnxGwQtWz6+yn07gj3U1
V19mdeKCUZWklRarrcr67u9DdEx+JowyEY/ppzgeQtW01g==
-----END RSA PRIVATE KEY-----

我可以获得公钥吗?

4个回答

我可以获得公钥吗?

这很容易使用openssl rsa

$ openssl rsa -in the-private-key-from-your-question.pem  -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtrKVnwse4anfX+JzM7imShXZU
C+QBXQ11A5bOWwHFkXc4nTfEOr3fJjnRSU5A3IROFU/pVVNiXJNkl7qQZK5mYb8j
3NgqX8zZJG7IwLJ/Pm2sRW5Qj32C/uJum64Q/iEIsCg/mJjDLh1lylEMEuzKgTdW
toeLfxDBL2AJ20qXzQIDAQAB
-----END PUBLIC KEY---

如果您想了解密钥文件中包含的内容,可以传递-text选项以查看人类可读(某种)调试转储。通过这种方式,您可以看到密钥文件既包含私人信息,也包含公共信息。特别是它包含完全描述公钥的模数和publicExponent:

$ openssl rsa -text -in the-private-key-from-your-question.pem
Private-Key: (1024 bit)
modulus:
    00:ad:ac:a5:67:c2:c7:b8:6a:77:d7:f8:9c:cc:ee:
    29:92:85:76:54:0b:e4:01:5d:0d:75:03:96:ce:5b:
    01:c5:91:77:38:9d:37:c4:3a:bd:df:26:39:d1:49:
    4e:40:dc:84:4e:15:4f:e9:55:53:62:5c:93:64:97:
    ba:90:64:ae:66:61:bf:23:dc:d8:2a:5f:cc:d9:24:
    6e:c8:c0:b2:7f:3e:6d:ac:45:6e:50:8f:7d:82:fe:
    e2:6e:9b:ae:10:fe:21:08:b0:28:3f:98:98:c3:2e:
    1d:65:ca:51:0c:12:ec:ca:81:37:56:b6:87:8b:7f:
    10:c1:2f:60:09:db:4a:97:cd
publicExponent: 65537 (0x10001)
privateExponent:
(…)

实际上,是的,您可以从私钥中获取公钥。 原则上,可以创建一个无法轻易获得相应公钥的 RSA 私钥,但这需要同时使用非标准的密钥生成方法和非标准的私钥存储格式。


让我们快速回顾一下基础知识。RSA 公钥包含两个值:

  • 模数n(两个秘密选择的大素数pq的乘积),以及
  • 公共指数e(对于许多密钥来说可以是相同的,通常选择为小的奇数素数,最常见的是 3 或 2 16 +1 = 65537)。

同时,RSA 私钥至少需要以下两个值:

  • 模数n(与公钥相同),以及
  • 私有指数d(根据公共指数e和模数的因子pq计算得出)。

但是,大多数用于存储 RSA 私钥的格式,包括您问题中显示的PKCS1 RSAPrivateKey 格式,实际上也存储了一堆附加值,包括:

  • 公共指数e ,
  • 模数的因子pq
  • 简化的私有指数d p = d mod ( p - 1) 和d q = d mod ( q - 1),以及
  • CRT 系数” q inv = q -1 mod p

特别是,在私钥格式中包含公共指数e意味着可以从符合 PKCS1 的私钥文件中轻松提取公钥。此外,即使公共指数e不包含在私钥文件中,知道模数的因子pq也可以很容易地从另一个指数中计算出一个指数。最后,即使我们不知道模数的因素,对于以通常方式生成的 RSA 密钥,我们也可以简单地测试最常用的e值,看看其中哪一个生成可以正确解密的密文给定的私钥。


综上所述,如果我们使用非标准的 RSA 密钥生成算法,从允许的值范围(即大于 1 且小于且与λ ( n ) = lcm互质的整数中随机选择e(或d ) ( p - 1, q - 1)),如果我们使用非标准的 RSA 私钥格式,只存储用于解密的最少信息(即nd),则无法计算公钥在没有有效破解密钥的情况下(即分解模数)。

实际上,如果以这种非标准方式使用,RSA 算法将变得“对称”,因为密钥 ( n , e ) 和 ( n , d ) 都不能从另一个有效地计算出来,并且任何一个都可以是任意指定为私钥。原则上,如果您不让私钥持有者知道相应的“公共”密钥(当然,这意味着它不再真正公开),那么他们只能解密消息而不能加密它们。唉,任何此类方案的实际用途都受到一个简单事实的限制,即无论谁生成密钥对,最终都将不可避免地知道它的两半。

是的。这也很容易。如果您查看 RSA 规范,公钥需要ne. 私钥可能有p q d. 使用这些来计算。

n=p*q
e=mod_inverse(d,euler_totient(n))

如果您想将它们打包成 PEM 格式,请参阅https://github.com/ius/rsatool

如果您需要 ssh 使用此命令

ssh-keygen -y -f private_key.pem