web-dev-qa-db-ja.com

RSA秘密鍵はパスワードなしでは役に立たないのですか?

(pgpを使用して)新しいgpgキーを生成するときはいつでも、それにパスワードを割り当てる必要があることに気づきました。これは完全に理にかなっています。しかし、私が間違っていなければ、gpgは素数に基づいています。このパスワードはどのように秘密鍵に統合されていますか?そして、誰かが秘密鍵を盗んだがパスワードを知らなかった場合、すべての暗号化されたデータはまだ安全ですか?

主な問題は、パスワードの総当たり攻撃が秘密鍵の総当たり攻撃に比べて取るに足らないことだと思いますか?これが問題である場合、十分に長いパスワードを使用することで、秘密鍵が危険にさらされている場合でもデータが安全であることを確認できますか?

3
user3256725

GPGがキーを生成する方法、およびこのプロセスでパスワードが果たす役割についての基本的な理解を求めているようです。背景を説明し、最後に直接の質問に答えます。

簡単に言えば、RSA秘密鍵にアクセスする必要があるたびに、パスワードを「シード」として使用して、RSA秘密鍵を復号化するために必要なAES-256鍵を再生成します(詳細については読んでください)。

RSA鍵の生成

RSAキーを生成するときは、できるだけランダムにして、オペレーティングシステムの暗号化乱数ジェネレーター(/dev/random Linuxなど)。 wikipedia/RSA_(cryptosystem)によると

プライムpおよびqを生成するには、適切なエントロピーが適切にシードされた、暗号学的に強力な乱数ジェネレーターを使用する必要があります。

鍵ファイルの保護

この質問 で説明したように、gpgはデフォルトの 対称暗号 を使用して、RSA秘密鍵をファイルに保存する前に暗号化します。 Gpgのデフォルトの対称暗号は以前は3DESでしたが、現在はAES-256です。これは、別の暗号を使用する場合にも構成できます(リンクされた質問には、使用可能な暗号のリストがあります)。

パスワードの役割

AES-256のような対称暗号を使用してRSA秘密鍵を暗号化するには、AES-256鍵が必要です。大野!再帰! thatキーを安全な方法でどのように保存しますか?答えは次のとおりです。そうしないでください。必要なときに、パスワードをシードとして使用して生成します。具体的には、 PBKDF2 アルゴリズムを使用して stretch のパスワードを使用し、完全な長さのランダムに見えるAES-256キーを作成します。このAES-256キーはどこにも保存されないため、パスワードは基本的に、RSAキーのロックを解除するゲートキーパーです。

パスワードをRSAキーに直接引き延ばすだけではどうですか。

これは明白な質問だからといってここに投げます。

AES-256や3DESなどの対称暗号には、キーの構造やプロパティがありません。文字通り、正しい長さのビットの任意の文字列をキーとして使用できます(それぞれ256ビットと168ビット)。

公開鍵暗号(RSA、楕円曲線、McEliece、NTRUなどの新しいポスト量子暗号)の場合、鍵は特定の数学的構造を持つ必要があります。たとえば、RSAでは、秘密鍵は2つの素数とそれに由来するいくつかの数字で構成する必要があるため、パスワードを適切な長さに伸ばしてRSA鍵として使用しようとすると、99.99 ...これは無効なRSAキーになります(つまり、結果のビットは2つの素数と関連する値にはなりません)。


直接的な質問に答える:

1。

そして、誰かが秘密鍵を盗んだがパスワードを知らなかった場合、すべての暗号化されたデータはまだ安全ですか?

「誰かが秘密鍵ファイルを盗んだがパスワードを知らなかった場合」を意味していると思います。はい、あなたのデータは安全です。彼らが持っているのは暗号化されたファイルだけであり、そこから秘密鍵を抽出する方法はありません。

ただし、decrypted秘密鍵を取得できた場合(たとえば、実行中のコンピューターのメモリダンプから)、没収され、パスワードは秘密鍵の保護にのみ使用されますディスク上にある間。

  1. 主な問題は、パスワードの総当たり攻撃が秘密鍵の総当たり攻撃に比べて取るに足らないことだと思いますか?

はい、攻撃者が暗号化されたキーファイルを手に入れれば、RSAキーを直接推測するよりも、パスワードを推測するための推測が少なくなります。

いくつかの数字

RSA-n(nは1024、2048、4096など)を解くために必要な推測数の正確な推定値を見つけるのは難しいため、おそらく keylength.com が最も近いので、巨大な塩の粒で下の数字を取ってください。

1024ビットのRSAキーが( keylength.com に従って)72ビットのセキュリティを提供するとします。攻撃者は平均して2を作成する必要があります72 RSAキーをクラックすると推測します。比較すると、数字、アッパー、ロワーを使用した12文字のパスワードは71.4ビットのセキュリティ [link to calc] (攻撃者は〜2を実行する必要があります71.4 推測)-それが完全にランダムに生成されたと仮定すると、それが辞書の単語でいっぱいである場合、71.4ビットよりはるかに弱いです。

32文字のパスワードで95の印刷可能なASCII文字をすべて使用すると、セキュリティが210ビットまで [link to calc] 、ほとんど完全にランダムなAES-256ビットキーと同じくらい。 RSA-8192キーは136ビットのセキュリティしか提供しないため、十分に長くランダムなパスワードを使用すると、パスワードは実際に保護しているRSAキーよりも強力になります(本当に?!)。

4
Mike Ounsworth

パスワードはキーの一部ではありませんが、秘密キーの暗号化に使用されます。技術的には、パスワードは キーストレッチアルゴリズム に入力され、その出力は秘密キーの暗号化に使用されます。

パスワードを保護する方法は次のとおりです。

  1. パスワードは長く強力なものにしてください。
  2. キーストレッチングアルゴリズムを許容できる範囲で遅くします。 この答え は、これを実現するために渡すことができるGPGへのコマンドライン引数をいくつか説明しています。

この文:

これが問題である場合、十分に長いパスワードを使用することで、秘密鍵が危険にさらされている場合でもデータが安全であることを確認できますか?

秘密鍵が侵害された場合、それはゲームオーバーです。しかし、秘密鍵の暗号化されたコピーを含むファイルが侵害された場合にどうなるかを尋ねていると思います。その場合、ユーザーが秘密キーを回復するには、パスワードを解読する必要があります。強力なパスワードと遅いキーストレッチ操作が役立つのはそのためです。

3
Neil Smithline