web-dev-qa-db-ja.com

RSA秘密鍵から公開鍵を取得できますか?

私が覚えている限り、公開鍵を使用してメッセージを暗号化し、秘密鍵を使用してメッセージを復号化します。私の質問は、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-----

公開鍵を取得できますか?

50
user162408

公開鍵を取得できますか?

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:
(…)
65
Steffen Ullrich

実際には、はい、秘密鍵から公開鍵を取得できます。原則として、作成するを作成できます対応する公開鍵を簡単に取得できないRSA秘密鍵ですが、これには、非標準の鍵生成方法と非標準の秘密鍵格納形式の両方を使用する必要があります。


基本を簡単に復習しましょう。 RSA公開鍵は、次の2つの値で構成されています。

  • モジュラスn(密かに選択された2つの大きな素数pおよびqの積)、および
  • 公開指数e(多くのキーで同じにすることができ、通常は小さな奇数の素数、最も一般的には3または2のいずれかになるように選択されます)16+1 = 65537)。

一方、RSA秘密鍵には少なくとも以下の2つの値が必要です。

  • 係数n(公開鍵と同じ)、および
  • プライベート指数d(パブリック指数eおよび係数の係数pおよびqから計算されます).

ただし、質問に示されている PKCS1 RSAPrivateKey形式を含む、RSA秘密鍵を格納するためのほとんどの形式は、実際には次のような追加の値の束も格納します。

  • 公開指数e
  • 係数の係数pおよびq
  • 削減されたプライベート指数dp = d mod(p − 1)およびdq = d mod(q − 1)、および
  • "CRT係数"qinv = q−1 mod p

特に、公開鍵eを秘密鍵フォーマットに含めることは、公開鍵をPKCS1準拠の秘密鍵ファイルから簡単に抽出できることを意味します。また、公開指数eが秘密鍵ファイルに含まれていなくても、係数の係数pおよびqを知っていると、どちらの指数でも許可されます他から簡単に計算されます。そして最後に、係数の係数がわからなくても、通常の方法で生成されたRSA鍵の場合、最も一般的に使用されるeの値をテストして、どれが生成されるかを確認できます。指定された秘密鍵を使用して正しく復号化できる暗号文。


そうは言っても、許容範囲内の値(つまり、より大きい整数)からランダムにe(またはd)を選択した非標準のRSA鍵生成アルゴリズムを使用する場合λn)= lcm(p − 1、q − 1で、1より小さく、互いに素である))、そして復号化のための最低限の情報のみを保存する非標準のRSA秘密鍵形式(つまりnおよびd)を使用した場合、それは秘密鍵から公開鍵を計算することは、鍵を効果的にクラックする(つまり、係数を因数分解する)ことなく可能です。

実際、そのような非標準的な方法で使用した場合、RSAアルゴリズムは、キー(ne)と(- nd)は、他方から効果的に計算でき、どちらか一方を任意に秘密鍵として指定できます。原則として、秘密鍵の所有者に対応する「公開」鍵を知らせなかった場合(もちろん、これは実際にはもう公開されないことを意味します)、メッセージを復号化するだけで暗号化することはできません。悲しいかな、 このようなスキームの実用的な有用性 は、キーペアを生成する人がその両方の半分を必然的に知ってしまうという単純な事実によってかなり制限されています。

27
Ilmari Karonen

はい。とても簡単です。 RSA仕様を見ると、公開鍵にはneが必要です。秘密鍵にはpqdが含まれる場合があります。これらを使用して計算します。

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

それらをPEM形式にパックする場合は、 https://github.com/ius/rsatool を参照してください。

4
sudhackar