web-dev-qa-db-ja.com

SSHキー:id_rsaがid_rsa.pubよりも大きいのはなぜですか?

私の秘密鍵(~/.ssh/id_rsa)は1766バイトのファイルですが、私の公開鍵(~/.ssh/id_rsa.pub)の長さはわずか396バイトです。なぜ大きな違いがあるのですか?秘密鍵がAESを使用して暗号化されているためですか? AES暗号文は通常、平文とほぼ同じ長さではありませんか?

8
splicer

秘密鍵には、公開鍵よりも多くの情報が含まれています。公開鍵は暗号化指数(e)とモジュラス(n)のみを伝達しますが、秘密鍵にはさらに復号化指数(d)とモジュラスの2つの素因数(pとq)が含まれます。秘密鍵には、基本的に公開鍵が含まれています。

[暗号化:暗号文=メッセージ^ e(mod n);復号化:メッセージ=暗号文^ d(mod n)]

秘密鍵ファイル内のすべてのデータを表示するには:

$ openssl rsa -in id_rsa -text -noout

編集:秘密鍵ファイルには明らかに暗号化指数がありませんが、指数d_1とd_2があります。ここで、d_1 = d(mod p-1)およびd_2 = d(mod q-1)です。これらは復号化を高速化するために使用されます。復号化のべき乗をより小さな並列べき乗の呼び出しに分割できます。これにより、大きなdと大きなnの1つの大きなm = c ^ d(mod n)よりも高速になります。

17
user75636

残念ながら、キーを保存する形式を指定していません。あなたはOpenSSHキーエンコーディングについて言及していると思います。この形式では、キーはbase64でエンコードされたデータブロックに保存されます。暗号化するときのエンコーディングに応じて、通常、データを暗号化するときに何らかのパディングが必要になります。したがって、結果のデータは暗号化ブロックサイズの倍数になります。

OpenSSHキーには、---- BEGIN SSH2 [PUBLIC|PRIVATE] KEY ----マーカーと-----END RSA [PUBLIC|PRIVATE] KEY-----マーカーの間に挿入されたある種のコメントや追加のプロパティを含めることもできます。 RFC4716 を参照してください。

さらに、公開鍵の場合はモジュラスと公開指数が保存され、秘密鍵の場合は秘密指数が保存されます。数学的ベースの詳細については、 WikipediaのRSAキー生成 を参照してください。これらのキー間の数学的接続を説明するWeb上の多くの場所があります。これらの説明のコピーがここに必要かどうかはわかりません。

理論的には、公開鍵情報から秘密鍵を計算することは可能ですが、これを行うことは、他の方法よりも数学的にはるかに困難です。秘密鍵をすべての変数を含む「ソース」と見なし、公開鍵を計算の結果と見なします。すべての変数を知っていれば、計算を何度も繰り返すのは簡単ですが、結果だけを知っていると、すべてのソース変数を取得するのは困難です。これが、秘密鍵を安全な場所に保存するだけで十分な理由でもあります。いつでも秘密鍵を使用して公開鍵を再計算できます。しかし、その逆ではありません-理論的にはこれを行うことができますが、キーの長さによっては、これには何年もかかる場合があります;)。

2
SkyBeam