これはよくわかりません。
によると:http : //www.madboa.com/geek/openssl/#key-rsa、秘密鍵から公開鍵を生成できます。
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
私の最初の考えは、それらはペアで生成されるというものでした。RSA秘密鍵には合計が含まれていますか?または公開鍵?
これはよくわかりません。
によると:http : //www.madboa.com/geek/openssl/#key-rsa、秘密鍵から公開鍵を生成できます。
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
私の最初の考えは、それらはペアで生成されるというものでした。RSA秘密鍵には合計が含まれていますか?または公開鍵?
回答:
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
e
そしてd
一般的な文献では)ことは私の理解でした。どちらも数学的にプライベートでもパブリックでもありません。これらは作成時に任意に割り当てられるラベルです。それらは逆に同じように簡単に割り当てることができます。一方から他方を生成することは同等の問題です。この.pem
形式には、両方の指数、したがって両方のキーを含む、情報の束がすべて含まれています。
openssl genrsa
コマンドで作成された秘密RSA鍵ファイルに埋め込まれます。ただし、別の公開鍵ファイルは同じ手順で作成されません。秘密鍵ファイルから別の公開鍵ファイルに公開鍵を抽出するには、openssl rsa -in private.pem -pubout -out public.pem
コマンドを使用します。この方法で公開鍵を生成すると、それは計算されずに秘密鍵ファイルから抽出されます。詳細については、以下の私の回答を参照してください。
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に出力します。
openssl rsa -in key.pem -pubout -out pubkey.pem
いません。明らかに、その出力はpem形式の公開鍵であるため、以前の回答は受け入れられませんでした。そのため、「キーが無効です。'ssh-rsa 'または' ssh-dss 'で始まる必要があります。公開鍵の半分をコピーしていることを確認してください」というエラーが発生しました。ただしssh-keygen -y [-f input_keyfile]
、Githubが使用する正しい形式を生成します。
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アルゴリズムを使用して何かを暗号化するには、モジュラスと暗号化(公開)指数ペア(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)を公開鍵となる別のファイルにコピーします。
e
は常に65537のよう0x010001
です。これはおそらく公開指数を選択する際のデファクトであり、これがおそらくmanページの理由であり、ほとんどすべての場所genrsa
はと説明されていto generate the private key
ます。公開されているものは少し明白です。
一部の人々が考えるように、公開鍵は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
ませんが
このコードでは、最初にプライベートなRSAキーを作成していますが、公開キーのペアも持っているため、実際の公開キーを取得するには、これを行います
openssl rsa -in mykey.pem -pubout > mykey.pub
あなたがそれをもっと多くの情報のためにそれを得ることを願ってこれをチェックしてください
まず、RSA鍵の生成について簡単にまとめます。
公開鍵は、係数と公開指数で構成されます。
最小の秘密鍵は、係数と秘密指数で構成されます。既知の係数とプライベート指数から対応するパブリック指数に移動するための、計算上実行可能な確実な方法はありません。
しかしながら:
したがって、ほとんどの実用的なRSA実装では、秘密鍵から公開鍵を取得できます。これが不可能なRSAベースの暗号システムを構築することは可能ですが、それは完了したことではありません。
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.