RSA秘密鍵を使用して公開鍵を生成しますか?


394

これはよくわかりません。

によると:http : //www.madboa.com/geek/openssl/#key-rsa、秘密鍵から公開鍵を生成できます。

openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub

私の最初の考えは、それらはペアで生成されるというものでした。RSA秘密鍵には合計が含まれていますか?または公開鍵?


1
rsaとopensslを使用していて、5 Kバイトのような大きなファイルを暗号化したいすべての人に。公開鍵は、暗号化したいものに比例するか、それよりも大きくする必要があることに注意してください。そうしないと、「ファイルが大きくなりすぎて暗号化されない」というエラーが発生します。要約すると、かなり大きくて深刻な秘密鍵を生成し、そこから秘密鍵を作成して、処理するデータがたくさんあると要約します。私はopensslで欠陥について知っている人に言った、そして彼らはそれをそれ自体でループさせるべきであると言った。
ケントハンセン

10
Kent Hansen氏が説明する問題は、RSAをプレーンテキストデータに直接使用することによるものです。これは、セキュリティ上の理由から、決して行うべきではありません。代わりに、RSA-KEM(tools.ietf.org/html/rfc5990#appendix-A)などの十分に分析されたハイブリッド暗号化スキームを使用し、encrypt-then-HMACなどの認証された対称暗号化スキームをデータに適用します。
Daira Hopwood

これが役立つことがあります。jason4zhu.blogspot.jp/2014/10/...
Judking


このリンクでSteffenUllrichの答えは、理由を説明する:@ security.stackexchange.com/questions/172274/...
bearzyj

回答:


577
openssl genrsa -out mykey.pem 1024

実際には公開鍵と秘密鍵のペアが生成されます。ペアは生成されたmykey.pemファイルに保存されます。

openssl rsa -in mykey.pem -pubout > mykey.pub

公開鍵を抽出して出力します。ここでは、この優れた説明ページへのリンクがあります。

編集:ここの例のセクションを確認してください。秘密鍵の公開部分だけを出力するには:

openssl rsa -in key.pem -pubout -out pubkey.pem

SSHの目的で使用可能な公開鍵を取得するには、ssh-keygenを使用します

ssh-keygen -y -f key.pem > key.pub

50
チュートリアルの誰もがopenssl genrsaコマンドを使用してプライベートキーを生成すると言っているのは混乱しています。それは、パブリックキーも生成していることを忘れているためです
Jaime Hablutzel

15
@jaime本当に責められますか?公式ドキュメントには、公開鍵についてはまったく何も書かれていません。「説明:genrsaコマンドはRSA秘密鍵を生成します。」openssl.org/docs/apps/genrsa.html
Despertar

124
@jaime、それはそうではないからです-genrsaは秘密鍵のみを生成し、公開鍵は保存されません。ただし、秘密鍵がある場合は、それから公開鍵を計算(導出)できます。これは、上記の2番目のコマンドが行うことです。公開鍵は抽出ではなく計算されます。
steveayre 2013

13
@steveayre RSAキーは単に2つの指数である(eそしてd一般的な文献では)ことは私の理解でした。どちらも数学的にプライベートでもパブリックでもありません。これらは作成時に任意に割り当てられるラベルです。それらは逆に同じように簡単に割り当てることができます。一方から他方を生成することは同等の問題です。この.pem形式には、両方の指数、したがって両方のキーを含む、情報の束がすべて含まれています。
lynks 2013

13
@steveayreはほとんど間違っています。公開RSA鍵コンポーネント(n、e)はで生成され、openssl genrsaコマンドで作成された秘密RSA鍵ファイルに埋め込まれます。ただし、別の公開鍵ファイルは同じ手順で作成されません。秘密鍵ファイルから別の公開鍵ファイルに公開鍵を抽出するには、openssl rsa -in private.pem -pubout -out public.pemコマンドを使用します。この方法で公開鍵を生成すると、それは計算されずに秘密鍵ファイルから抽出されます。詳細については、以下の私の回答を参照してください。
ゴーレム2017年

273

SSH公開鍵を探している人...

OpenSSHで使用するために公開鍵を抽出する場合は、公開鍵を少し異なる方法で取得する必要があります

$ ssh-keygen -y -f mykey.pem > mykey.pub

この公開鍵形式はOpenSSHと互換性があります。公開鍵をに追加すると、準備が整いremote:~/.ssh/authorized_keysます


からのドキュメント SSH-KEYGEN(1)

ssh-keygen -y [-f input_keyfile]  

-yこのオプションは、プライベートOpenSSHフォーマットファイルを読み取り、OpenSSH公開鍵をstdoutに出力します。


3
これは魅力のように機能します!Githubが使用するフォーマットを生成します!GithubはPEM形式を採用してopenssl rsa -in key.pem -pubout -out pubkey.pemいません。明らかに、その出力はpem形式の公開鍵であるため、以前の回答は受け入れられませんでした。そのため、「キーが無効です。'ssh-rsa 'または' ssh-dss 'で始まる必要があります。公開鍵の半分をコピーしていることを確認してください」というエラーが発生しました。ただしssh-keygen -y [-f input_keyfile] 、Githubが使用する正しい形式を生成します。
Devy 2013年

71

opensslを含むRSA秘密鍵を生成するほとんどのソフトウェアでは、秘密鍵はPKCS#1 RSAPrivatekeyオブジェクトまたはそのバリアントとして表されます。

A.1.2 RSA秘密鍵の構文

RSA秘密鍵は、ASN.1タイプの
RSAPrivateKeyで表す必要があります。

  RSAPrivateKey ::= SEQUENCE {
      version           Version,
      modulus           INTEGER,  -- n
      publicExponent    INTEGER,  -- e
      privateExponent   INTEGER,  -- d
      prime1            INTEGER,  -- p
      prime2            INTEGER,  -- q
      exponent1         INTEGER,  -- d mod (p-1)
      exponent2         INTEGER,  -- d mod (q-1)
      coefficient       INTEGER,  -- (inverse of q) mod p
      otherPrimeInfos   OtherPrimeInfos OPTIONAL
  }

ご覧のとおり、この形式には係数や公開指数を含む多数のフィールドがあり、RSA公開鍵の情報の厳密なスーパーセットです。


秘密鍵が与えられた場合、数学的に公開鍵を生成することが可能であることを意味しますか?RSAの長所は、他のキーを指定すると、1つのキーを生成するのが計算上不可能であることではありませんか?
Raam

30
@Raam:いいえ、RSAの長所は、公開鍵から秘密鍵を生成することが不可能であることです。プライベートが簡単なパブリックフォームを生成します。
James K. Polk大統領、2011年

@GregS、なぜ?キーは、係数と指数で構成されます。これら2つの数値から他の指数を計算できる場合、RSAは簡単に解読されます。それでは、OpenSSL秘密鍵には指数と係数以外のものが含まれていますか?
Calmarius 14

1
@Calmarius:キーは係数と指数で構成されると誰が言ったのですか?それが最小の秘密鍵ですが、通常、秘密鍵には主要な要素などの他のコンポーネントが含まれています。詳細については回答をお読みください。
ジェームズKポーク大統領2014

1
@JamesKPolkそれは必ずしも本当ではありません。場合は、パブリック指数(すなわち、プライベート指数と同じ性質を持っている)が大きい、その後、公開鍵があることも再構築することは不可能。ほとんどのライブラリはこれをサポートしませんが、RSA暗号システムでは、秘密鍵から公開鍵を再構築する必要はありません。
Maarten Bodewes

34

以下の私の回答は少し長いですが、うまくいけば、以前の回答では欠けているいくつかの詳細が提供されます。私はいくつかの関連するステートメントから始め、最後に最初の質問に答えます。

RSAアルゴリズムを使用して何かを暗号化するには、モジュラスと暗号化(公開)指数ペア(n、e)が必要です。それがあなたの公開鍵です。RSAアルゴリズムを使用して何かを復号化するには、係数と復号化(プライベート)指数ペア(n、d)が必要です。それがあなたの秘密鍵です。

RSA公開キーを使用して何かを暗号化するには、プレーンテキストを数値として扱い、eモジュラスnの累乗に引き上げます。

ciphertext = ( plaintext^e ) mod n

RSA秘密キーを使用して何かを復号化するには、暗号文を数値として扱い、それをdモジュラスnで累乗します。

plaintext = ( ciphertext^d ) mod n

opensslを使用して秘密(d、n)キーを生成するには、次のコマンドを使用できます。

openssl genrsa -out private.pem 1024

opensslを使用して秘密鍵から公開(e、n)鍵を生成するには、次のコマンドを使用できます。

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

上記のopensslコマンドによって生成されたprivate.pemプライベートRSAキーの内容を分析するには、次のコマンドを実行します(ここではラベルに切り捨てられた出力)。

openssl rsa -in private.pem -text -noout | less

modulus         - n
privateExponent - d
publicExponent  - e
prime1          - p
prime2          - q
exponent1       - d mod (p-1)
exponent2       - d mod (q-1)
coefficient     - (q^-1) mod p

秘密鍵は(n、d)ペアのみで構成されるべきではありませんか?なぜ6つの追加コンポーネントがあるのですか?これにはe(公開指数)が含まれているため、公開RSA鍵は、private.pem秘密RSA鍵から生成/抽出/導出できます。残りの5つのコンポーネントは、復号化プロセスを高速化するためにあります。これらの5つの値を事前に計算して保存することにより、RSA復号化を4倍に高速化できることがわかります。復号化はこれらの5つのコンポーネントなしで機能しますが、手元にあれば、より高速に実行できます。高速化アルゴリズムは、中国の剰余定理に基づいています。

はい、private.pem RSA秘密鍵には、実際にはこれらの8つの値がすべて含まれています。前のコマンドを実行しても、その場で生成されるものはありません。次のコマンドを実行して、出力を比較してください。

# Convert the key from PEM to DER (binary) format
openssl rsa -in private.pem -outform der -out private.der

# Print private.der private key contents as binary stream
xxd -p private.der

# Now compare the output of the above command with output 
# of the earlier openssl command that outputs private key
# components. If you stare at both outputs long enough
# you should be able to confirm that all components are
# indeed lurking somewhere in the binary stream
openssl rsa -in private.pem -text -noout | less

RSA秘密鍵のこの構造は、PKCS#1 v1.5によって代替(2番目の)表現として推奨されています。PKCS#1 v2.0標準は、代替表現からeおよびd指数を完全に除外します。PKCS#1 v2.1およびv2.2では、オプションでCRT関連のコンポーネントを追加することにより、代替表現にさらに変更を提案しています。

public.pem公開RSAキーの内容を表示するには、次を実行します(ここではラベルに切り捨てられた出力)。

openssl rsa -in public.pem -text -pubin -noout

Modulus             - n
Exponent (public)   - e

ここに驚きはありません。約束通り、これは(n、e)のペアです。

最後に、最初の質問に答えます。上記のように、opensslを使用して生成された秘密RSAキーには、公開キーと秘密キーの両方のコンポーネントなどが含まれています。秘密鍵から公開鍵を生成/抽出/派生すると、opensslはそれらのコンポーネントの2つ(e、n)を公開鍵となる別のファイルにコピーします。


あなたは「秘密鍵から公開(d、n)鍵を生成するには...」と書きました。「(e、n)」じゃないですか?すばらしい回答をありがとうございます!
エラクティック2017

v1.5の(外部の)「構文」を以降のバージョンのセマンティクスと比較しています。2.0#11.1.2と2.1および2.2#A.1.2を確認すると、n、e、dがまだ存在していることがわかります。(James Polkの回答にすでに記載されています。)
dave_thompson_085

1
驚くべき説明。おかげで
フランシスコアルバート

1
公開指数eは常に65537のよう0x010001です。これはおそらく公開指数を選択する際のデファクトであり、これがおそらくmanページの理由であり、ほとんどすべての場所genrsaはと説明されていto generate the private keyます。公開されているものは少し明白です。
シャンプー

(n、d)からのみ(n、e)を計算できますか?
Flyq

21

一部の人々が考えるように、公開鍵はPEMファイルに保存されません。次のDER構造が秘密鍵ファイルにあります。

openssl rsa -text -in mykey.pem

RSAPrivateKey ::= SEQUENCE {
  version           Version,
  modulus           INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent   INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1         INTEGER,  -- d mod (p-1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}

だから何である公開鍵(モジュラスと公開指数)、計算するための十分なデータがありopenssl rsa -in mykey.pem -puboutませんが


公開鍵はそこに格納されていませんが、秘密鍵と同様に導出可能ですが、そこに格納されている秘密鍵も表示されません。それでも私がpemファイルを猫にすると、秘密鍵といくつかのASCIIが書かれているのがわかります。
barlop 2014年

2
秘密鍵も導出されます。privateExponentフィールドを見てください。あなたはopensslのRSA -text -in MYKEY.PEMを使用してフィールドを見ることができます
Uxio

2
pemにはeとd、つまり公開鍵も含まれているため、公開鍵は実際にはpemに格納されます。離散ログアルゴとは異なり、rsa公開鍵は、秘密鍵(d、n)だけから計算することはできません。これは、RSA仕様で秘密鍵やその他の情報とともに保存するように指示されているためです。
Michael Chourdakis

1
うん、この答えはすべての意図と目的が間違っています。公開指数と係数の両方がそこにあるので、公開鍵は確かに存在します。計算を行わずに公開鍵を簡単に取得する以外に、そこにある公開指数は必要ありません。
Maarten Bodewes 2017

1
@MaartenBodewes:正解です。引用されているものは、関連するRFCから、PRIVATEキーに格納される値として取得されます。2つの値が公開鍵の暗号化にも使用されるだけで、これが秘密鍵のデータであることは変わりません。私はこの2日間、質問をすることではなく、関連する標準を調べて読むことで、これらすべてを学びました。私は今、ASN.1、DER、PEM、およびRSAについてすべて理解しています(おそらくRSAについてすべてではありません)。
AlastairG 2017年

8

このコードでは、最初にプライベートなRSAキーを作成していますが、公開キーのペアも持っているため、実際の公開キーを取得するには、これを行います

openssl rsa -in mykey.pem -pubout > mykey.pub

あなたがそれをもっと多くの情報のためにそれを得ることを願ってこれをチェックしてください


6

まず、RSA鍵の生成について簡単にまとめます。

  1. 適切なサイズ(pとq)の2つのランダムな素数をランダムに選択します。
  2. 2つの素数を乗算して、係数(n)を生成します。
  3. 公開指数を選択します(e)。
  4. プライムとパブリック指数を使っていくつかの計算を行って、プライベート指数を作成します(d)。

公開鍵は、係数と公開指数で構成されます。

最小の秘密鍵は、係数と秘密指数で構成されます。既知の係数とプライベート指数から対応するパブリック指数に移動するための、計算上実行可能な確実な方法はありません。

しかしながら:

  1. 実用的な秘密鍵の形式では、ほとんどの場合、nとdより多くのものが格納されます。
  2. eは通常ランダムに選択されるのではなく、いくつかのよく知られた値の1つが使用されます。eが既知の値の1つであり、dがわかっている場合は、試行錯誤によってeを簡単に見つけることができます。

したがって、ほとんどの実用的なRSA実装では、秘密鍵から公開鍵を取得できます。これが不可能なRSAベースの暗号システムを構築することは可能ですが、それは完了したことではありません。


1
Use the following commands:

1. openssl req -x509 -nodes -days 365 -sha256 -newkey rsa:2048 -keyout mycert.pem -out mycert.pem

Loading 'screen' into random state - done
Generating a 2048 bit RSA private key
.............+++
..................................................................................................................................................................+++
writing new private key to 'mycert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

2. If you check there will be a file created by the name : mycert.pem

3. openssl rsa -in mycert.pem -pubout > mykey.txt
writing RSA key

4. If you check the same file location a new public key : mykey.txt will be created.

1
これはばかげています。必要なものがすべてキーペアである場合、無駄な証明書を作成するために特別な労力を費やす必要はありません。証明書が必要な他のQについては、これが答えになる可能性があります。
dave_thompson_085
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.