web-dev-qa-db-ja.com

公開鍵を生成するためにRSA秘密鍵を使用しますか?

私は本当にこれを理解していません:

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

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

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

346
c2h2
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
489
Raam

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公開鍵を標準出力に出力します。

262
user633183

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公開鍵 の情報の厳密なスーパーセットです。

63
James K Polk

公開鍵は、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の動作です。

21
Uxio

以下の私の答えは少し長いですが、うまくいけば、それは前の答えで欠けているいくつかの詳細を提供します。いくつかの関連する文から始めて、最後に最初の質問に答えます。

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 によって代替の( second )表現として推奨されています。 PKCS#1 v2.0 standardは、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)を別のファイルにコピーして、それが公開鍵になります。

20
golem

ここでは、このコードの最初の部分で秘密鍵となるRSA鍵を作成していますが、公開鍵のペアも持っているので、実際の公開鍵を取得するためには次のようにします。

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

あなたがより多くの情報のためにそれを得ることを望みなさい これをチェックしなさい

8
Rdx

最初にRSA鍵生成について簡単に要約します。

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

公開鍵はモジュラスと公開指数で構成されています。

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

しかしながら:

  1. 実用的な秘密鍵フォーマットはほとんどいつもnとd以上を格納します。
  2. eは通常ランダムに選ばれるのではなく、少数のよく知られた値の1つが使用されます。 eがよく知られている値の1つであり、dを知っているならば、試行錯誤によってeを把握するのは簡単でしょう。

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

4
plugwash
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.
0
Ankit Jain