web-dev-qa-db-ja.com

RSA公開鍵と秘密鍵の長さ

RSA公開鍵とその秘密鍵のペアのサイズを理解するのに問題があります。

RSAアルゴリズムのさまざまなキーサイズ(512、1024など)を見ましたが、これは公開キーの長さまたは秘密キーの長さですか、それとも両方の長さが同じですか?

私はすでにそれを検索しましたが、:

  1. this の質問では、RSAアルゴリズムの秘密鍵と公開鍵は同じ長さであると述べられています。だが:
  2. this の質問では、長さが異なると記載されています!

どちらの回答も受け入れられます。それらの長さは等しいか、または異なりますか?

さらに、RSAキーペアを生成するmy Javaカードアプレットは、常に同じ長さの公開キーと秘密キーを返します。RSAキーペアを生成するためのオンラインツールには、異なる長さの出力があります。

例:

オンラインツール1

enter image description here

オンラインツール2

enter image description here

30
TheGoodUser

> RSAアルゴリズムの異なるキーサイズ(512、1024、... [ビット]など)を見ましたが、これは公開キーの長さまたは秘密キーの長さ、あるいはその両方です。長さが等しいですか?

これは、RSAキーペアの計算に使用される係数の長さです。公開鍵は係数と公開指数で構成され、秘密鍵は係数と秘密指数で構成されます。

> RSAキーペアを生成するためのオンラインツールでは、出力される長さが異なります!

最初の図は、Base64でエンコードされたPEM形式の公開鍵と秘密鍵を示しています(代わりに2番目の図に示されている鍵の係数と指数は表示されていません)。

RSA秘密鍵の内容は次のとおりです。

-----BEGIN RSA PRIVATE KEY-----
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
}
-----END RSA PRIVATE KEY-----

一方、RSA公開鍵には次のデータのみが含まれます。

-----BEGIN RSA PUBLIC KEY-----
RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
}
-----END RSA PUBLIC KEY-----

これが、秘密鍵ブロックが大きい理由を説明しています。

では、なぜ秘密鍵に大量のデータが含まれるのでしょうか。結局のところ、モジュラスnとプライベート指数dのみが必要です。他のすべてのものを事前に計算して秘密鍵ブロックに含める理由は、 Chinese Remainder Algorithm を使用して復号化を高速化するためです。 (コメントでこれを指摘してくれた@dbernardへの称賛)

非RSA公開鍵のより標準的な形式は次のとおりです。

-----BEGIN PUBLIC KEY-----
PublicKeyInfo ::= SEQUENCE {
  algorithm       AlgorithmIdentifier,
  PublicKey       BIT STRING
}
AlgorithmIdentifier ::= SEQUENCE {
  algorithm       OBJECT IDENTIFIER,
  parameters      ANY DEFINED BY algorithm OPTIONAL
}
-----END PUBLIC KEY-----

詳細 ここ

ところで、あなたは秘密鍵のスクリーンショットを投稿したばかりなので、それが単にテスト用であることを強く望みます:)

28
dr_

RSA公開鍵はいくつかの(大きな)整数値で構成され、RSA秘密鍵もいくつかの整数値で構成されます。内容は異なりますが、RSA公開鍵と対応するRSA秘密鍵は共通の数学構造を共有しており、特に、両方ともmodulusと呼ばれる特定の値を含んでいます。特定のペアの公開鍵と秘密鍵は必ず同じモジュラス値で機能します。それ以外の場合、RSAは機能しません(公開鍵で暗号化されたものは、対応する秘密鍵で復号化する必要があります )。

従来どおり、RSA鍵の「長さ」は、モジュラスの長さ(ビット単位)です。 RSA鍵の長さが「2048」であると言われる場合、それは実際にはモジュラス値が2の間にあることを意味します2047 と22048。特定のペアの公開鍵と秘密鍵は同じ係数を共有するため、定義により、同じ「長さ」も持ちます。

ただし、公開鍵と秘密鍵の両方に、モジュラス以外の値が含まれています。したがって、公開鍵または秘密鍵をバイトにエンコードするとき(ファイルに格納できるようにするため)、モジュラスにはバイト以外のものが必要になります。 2048ビットのモジュラスは理論的には正確に256バイトに収まります(256 * 8 = 2048であるため)が、他の値をエンコードするにはさらにバイトが必要です。

また、RSA公開鍵は、モジュラスと、「非常に短い」「公開指数」と呼ばれる別の値で構成されます。そのため、公開鍵のエンコードに必要な追加バイトは比較的少なくなります。モジュラスは公開鍵の最大のチャンクです。これは、秘密鍵には当てはまりません。これには、係数と公開指数(公開鍵のような)が含まれますが、「秘密指数」(係数とほぼ同じ大きさ)と、サイズが約半分の5つの値も含まれます係数のそれ。結果として、エンコードされた秘密鍵は、対応するエンコードされた公開鍵の約5倍(バイトで数えた場合)になると予想されます。

これらはエンコーディングに関する考慮事項です。 「RSA鍵の長さ」(「2048ビットの鍵」など)は係数の数値に関連し、因子と削減された指数とCRT係数の全道具のエンコードされた長さに関連しません。

14
Thomas Pornin