RSAとPGPに関する質問の answer で、PulpSpyは次のように述べています。
GPGを使用してRSAキーペアを生成することが可能です(暗号化と署名の両方に-両方に同じキーを使用しないでください)。
これの背後にある理由は何ですか?
おそらく、公開鍵暗号化に関する私の理解には欠陥がありますが、操作はこれに似ていると思いました。
暗号化と署名に異なるキーを使用することがなぜ重要なのですか?これは、通信したいすべての人に2つの公開鍵を配布する必要があるという意味でもありませんか?これは簡単にある程度の混乱とキーの誤用につながると思います。
ほとんどの場合、署名と暗号化キーの使用について、管理アプローチとタイムフレームが異なります。
否認防止の場合、他人になりすまされる可能性があるため、誰かがあなたの署名鍵を制御することを決して望まない。しかし、職場では暗号化キーをエスクローして、暗号化した情報にアクセスする必要がある他の人がアクセスできるようにする場合があります。
また、世界中の人々が過去の署名を確認できるように、署名鍵を長期間有効にしたい場合がありますが、暗号化鍵を使用すると、多くの場合、すぐにロールオーバーし、古い鍵を取り消すことができます。多くの面倒。
署名と暗号化の両方に同じキーペアを使用するのは潜在的に安全ではないです。これを行うと、使用する特定の公開鍵スキームによっては、攻撃が可能になる場合があります。この種の使用は、システムが設計されたものではないため、設計されていない方法でシステムを使用すると、「保証が無効になります」。
しないでください。困ったことです。
暗号化と署名に同じキーを使用してはならない理由がいくつかあります。
暗号化されたデータの秘密鍵をバックアップする必要があります。後でいくつかの古い暗号化されたメッセージを復号化したいのですが、署名のために秘密鍵をバックアップする必要はありません。攻撃者がキーを見つけた場合、CAにキーを取り消し、バックアップの必要なしに署名するための新しい秘密キーを取得するように指示できます。
さらに重要:暗号化と署名に同じキーを使用する場合、攻撃者はこれを使用して暗号化されたメッセージを復号化できます。これは彼/彼女がすることです:
攻撃者は乱数r
を選択する必要があります。
r
にはGDC(N, r) = 1
が必要です
およびN
は、秘密鍵と公開鍵の作成に使用される番号です(_N = pq
_)
次に、攻撃者は新しいメッセージ(_m′
_)を選択し、これを署名用に送信者に送信します。
_m′ = m^e.r^e
_…(ここで_(e,n)
_は公開鍵です)
送信者が_m′
_に署名すると、
m′^d ≡ (m^e.r^e)^d ≡ m.r (mod N)
これで、攻撃者はr
(秘密のメッセージ)を取得するためにm
で「除算」するだけで済みます。
署名と暗号化に別々のキーを使用する理由:
参照
私にとっての主な理由は、暗号化セキュリティ自体ではなく、キー管理に関連しています。
非対称暗号の場合、特に公開鍵を有効にしたい期間は、その鍵の使用目的に強く依存する場合があります。たとえば、コンポーネントが他のコンポーネントに対して自分自身を認証する必要があるシステムを考えてみます。次に、そのコンポーネントは、一部のデータに署名を定期的に作成する必要もあります。理論的には、単一の秘密鍵を両方の目的に使用できます。ただし、セキュリティ上の理由からPKI認証局が、単一の証明書に基づいて認証が成功する期間を2年に制限したいとします。同時に、データ保持法では、データを5年間保持し、そのデータの署名をその期間全体にわたって検証できるようにする必要がある場合があります。この問題を解決する唯一の(適切な)方法は、コンポーネントに2つの秘密鍵を与えることです。1つは認証用、もう1つは署名用です。最初のキーの証明書は2年後に期限切れになり、署名用の証明書は5年後に期限切れになります。
同様の推論を対称暗号に適用できます。異なる目的で異なる鍵を使用する場合、鍵管理のすべての質問(たとえば、マスター鍵のロールオーバーの頻度、鍵をバックアップする期間など)に基づいて決定できます。単一の目的の要件に基づいて。複数の目的で単一の(マスター)キーを使用すると、要件が競合する可能性があります。
RSA暗号化は、トラップドア機能、つまり2つの機能に基づいています。それらをD
およびE
と呼びます。関数は、D(E(x)) = x
およびE(D(x)) = x
(x
の場合)になるように設計されています。つまり、D
とE
は逆です。 Trapdoor関数の特徴は、公開鍵がある場合、E
(実際には)しか計算できないことです。秘密鍵がある場合は、D
とE
の両方を計算できます。
暗号化が機能する方法は、その説明からかなり明白です。ボブがアリスに暗号化されたメッセージを送信したい場合、彼はciphertext := E(plaintext)
を計算します。次に、ボブはciphertext
をアリスに送信します。アリスはD(ciphertext)
を計算します。これはD(E(plaintext))
であり、これは単なるplaintext
です。
次に、署名の仕組みについて説明します。アリスがmessage
に署名したい場合、signature := D(message)
を計算します。次に、message
とsignature
の両方をボブに送信します。次に、ボブはvalidation := E(signature)
を計算します。 signature
はD(message)
なので、validation = E(D(message)) = message
になります。
言い換えると、メッセージに署名するには、まるでそれを解読しているように振る舞い、それがあなたの署名なのです。署名を検証するために、人々は署名を暗号化して、元のメッセージを確実に取り戻すことができます。
繰り返しますが、署名は復号化と同じ操作です。
これは、署名と暗号化キーの分離に関する基本的な懸念事項です。誰かがあなたに何かを署名させることができるなら、彼らはちょうどあなたにそれを解読するようにさせました。
公証会社を経営しているとしましょう。誰かがあなたに$ 10とメッセージ(たとえば、歌詞)を与えた場合は、そのメッセージに署名して返信します。誰かが後で歌詞をコピーした場合、信頼できる公証人の署名を作成して、それらの歌詞を書いたことを示すことができます。
ここで、イブが公証会社への暗号化されたメッセージを傍受したとします。どのようにして彼女は暗号化を覆すことができますか?彼女は同じメッセージを公証のためにあなたに送ります!次に、署名操作(これは、復号化操作と同じです)を実行し、結果を彼女に送り返します。彼女は今復号化されたメッセージを持っています。
実際には、プロトコルにはこの攻撃をより困難にするステップがあります。たとえば、PGP(つまり、プロトコルを意味します。ここではgpgが最も一般的な実装です)は元のメッセージに署名しません。メッセージのハッシュに署名します。ただし、セキュリティ証明は単純な状況で最適です。 RSAのセキュリティについての証明がハッシュ関数に依存するのは望ましくありません。 (たとえば、多くの人が長い間優先ハッシュとしてMD5を使用していましたが、現在MD5はかなり壊れていると考えられています。)単独で、RSAのセキュリティは、暗号化に使用されているキーで任意のメッセージに署名しないという考えに依存しています。その要件を維持することは、PGPのセキュリティを確保するための最良の方法です。 (私が覚えているように、これは、Bruce Scheierの本 Applied Cryptography で非対称暗号化に関して最も頻繁に繰り返される警告です。)
さて、あなたが尋ねた別の質問について話しましょう:「これはまた、あなたが通信したいすべての人に2つの公開鍵を配布する必要があるという意味ではないでしょうか?」
「鍵」とは、ユーザーにとっては1つのことを意味し、暗号化の実装にとっては別のことを意味します。通信する必要があるのは1つのユーザーレベルの「鍵」だけですが、RSA公開鍵が多数含まれている場合があります。
PGPにはサブキーの概念があります。私のマスターキーは署名専用のキーです。別の暗号化サブキーがあります。そのサブキーは私のマスターキーによって署名されています。キーサーバーからPGPキーをインポートするか、Webサイトからダウンロードすると、マスターキーとすべてのサブキーを取得できます。私のマスターキーだけに署名したとしても、私のマスターキーは私の暗号化サブキーに署名したので、それも私に属していることがわかります。つまり、私のPGPキー(多くのRSA公開キーを含む)をダウンロードすることで、私の署名の検証と私へのメッセージの暗号化の両方に必要なものがすべて揃ったことになります。
サブキーを使用すると、暗号化の観点からはキー管理がより複雑になります(通過する追加のキー検証手順があります)が、実際の観点からは複雑ではありません(私のPGPキーには私のマスターキーとすべてのサブキーが含まれます)。余分な複雑さは実装に隠されており、ユーザーには公開されません。