回答:
ほとんどの秘密鍵アルゴリズムは、現在のコンピューティングインフラストラクチャを前提として、数値をその素因数に因数分解するなど、特定の計算の実行不可能性に依存しています。
同時に、暗号化と復号化に使用される場合、それらのほとんどは計算量が多いため、秘密鍵を使用してメッセージストリーム全体が暗号化されることはありません。むしろ、メッセージは他の(それほど集中的ではない)アルゴリズムを使用して暗号化され、その暗号化に使用されるキーはプライベートキーを使用して暗号化されます。
もちろん、あなたが指摘しているように、鍵の安全な交換は依然として問題であり、ある程度まで対処することができます:
アリスとボブが同じ秘密鍵について合意したいときはいつでも、最も一般的な方法はDiffie-Hellmanを使用することです。次のように機能します。
最初に2つのパブリック値が選択されます。たとえば、とg = 17です。(通常、これらは非常に大きな素数であり、そのプロトコルを使用するすべての人に知られています)。
秘密鍵暗号化の問題は中間者攻撃であり、それが秘密鍵暗号化よりも公開鍵暗号化を選択する主な理由の1つです。
まず、用語のポイント:説明するのは対称暗号化であり、参加者間で共有されるキーは通常秘密キーとして知られています。「秘密鍵」とは、通常、公開鍵暗号方式の鍵のうち、1人の参加者だけが知っている部分を意味します。
秘密鍵を広めるには、2つの方法があります。物理的に安全な方法で転送する方法と、公開鍵暗号法などの別の形式の暗号化を使用して転送する方法です。
秘密の通信チャネルを必要としない秘密鍵を交換する方法があります。最も一般的なのは、Diffie-Hellman鍵交換プロトコルです。Diffie-Hellmanの原則は、各参加者が独自のキーペアを生成することであり、1つの公開キーと1つの秘密キーから多数を構築する数学演算があります。この数学的操作には非常に興味深い特性があります。アリスの秘密鍵とボブの公開鍵、またはボブの秘密鍵とアリスの公開鍵から多数を構築できます。どちらの方法でも同じ数字が得られます。したがって、アリスとボブは公開鍵を交換し、両方の当事者が多数を知っているので、それを秘密鍵として使用できます。盗聴者は両方の公開鍵を見つけることができますが、公開鍵だけで多数を見つけることは不可能です¹。
Diffie-Hellmanキー交換により、誰がリッスンしていても、2者が秘密を交換できます。ただし、ボブに対してアリスを認証することはなく、その逆も同様です。したがって、中間者攻撃の影響を受けやすくなります。マロリーは、アリス(ボブと話していると考えている)とキー交換を実行し、ボブ(彼はアリスと話していると考えている)と別々にキー交換を実行します。少なくとも秘密を知っている。
攻撃者がメッセージを傍受して注入できる場合、参加者が相互に認証するにはより多くの暗号化が必要です。(受動的な攻撃者とは、事実上、基礎となるトランスポートプロトコルが認証を提供することを意味します。)簡単な方法は、各参加者が互いの公開鍵を既に知っていることです。アリスがボブの公開鍵を知っている場合:
これらのメソッドの1つ(または別のバリアント)を1つの方向に使用し、同じまたは異なるメソッドを別の方向に使用する、または1つの方向のみで認証する多くのバリアントがあります。たとえば、SSL / TLS(HTTPS、SMTPS、IMAPSなどの多くの-sプロトコルの暗号化レイヤー)は、いくつかの異なる暗号の組み合わせを使用でき、通常はクライアントに対してサーバーを認証しますが、オプションでクライアントも認証できます。Diffie-Hellmanは、このアプリケーションでは遅くて扱いにくいです。公開鍵配布を伴う最も広く使用されているアルゴリズムはRSAです。
もちろん、アリスとボブは事前に互いの公開鍵を知らないかもしれません。そのため、代わりに信頼チェーンに依存します。ボブはアリスに自分の公開鍵を送信します。この鍵は、この鍵が実際にボブの公開鍵であることを確認する第三者からの署名済みステートメントとともに送信されます この署名された声明は証明書と呼ばれ、サードパーティは認証局です。第三者はボブに知られているかもしれませんし、その身元は第三者によって確認されるかもしれません。最終的に、この信頼のチェーン(…ボブを保証するチャーリーのドミニクの保証)は、ボブが既に信頼しているパーティーロンに到達する必要があります。
公開キー暗号化に依存しないプロトコルがあります。特に、KerberosプロトコルはUNIXベースとWindowsベースの両方のネットワークで使用され、クライアントとサーバー間の接続を確立します。Kerberosは、キー配布センター(KDC)と呼ばれる中央認証サーバーを使用します。KDCはユーザーのパスワードをデータベースに保存する必要があり、クライアントは通常ユーザーにパスワードを要求します。パスワードの公開を避けるため、プロトコルはパスワードを直接使用せず、暗号化ハッシュまたはより一般的にはパスワードに適用されるキー派生関数を使用します。
この共有シークレットを使用して、クライアントとKDCは安全なチャネルを確立し、KDCはクライアントに「チケット」を送信します。チケットには、セッションキー(つまり、新しく生成された秘密キー)と、KDCとクライアントが接続するサーバーとの間で共有される別の対称キーで暗号化されたキーのコピーが含まれます。次に、クライアントはこの暗号化されたコピーをサーバーに転送します。サーバーはこのメッセージを復号化してセッションキーを取得し、セッションキーで暗号化するナンスを生成してクライアントに送り返します。次に、クライアントはサーバーとの安全なチャネルを開始し、セッションキーで暗号化し、nonceを復号化できることを示すことから始めます。これにより、サーバーに対してクライアントが認証されます。Kerberosセッションの確立は、Needham-Schroederプロトコルの変形です。
¹ 暗号作成者は一生懸命努力したという意味では、彼らがそれを実現するための最良の方法は、達成できない量の計算能力を必要とします。
可能な方法は、最初に公開鍵暗号を使用して秘密鍵を交換することです。ただし、それが不可能な場合、特定のキー交換プロトコルがいくつかあります。おそらく最もよく知られているのはDiffie-Hellmanプロトコルです。