メッセージの暗号化には,処理速度が速いことから一般に共通鍵暗号が用いられる.しかし,共通鍵暗号を用いるには事前に秘密鍵を共有しておく必要がある.
これを実現する方法には次のような方式がある.
鍵配送センターを利用した鍵共有方式として Kerberos がある.
Kerberos では,Key Distribution Center (KDC:鍵配送センタ) を介して鍵の共有を行う. すべての参加者は KDC を信頼し,KDC のみが信頼性の責任を持つことを前提にする. KDC は各参加者とそれぞれ秘密の鍵(暗号鍵)を共有する.KDC はこの秘密の鍵を通じて参加者の身元を確認する.
$A$ が $B$ に対する認証を行なう場合の手順は次のようになる.
この手順により,$A$ と $B$ は同じセッション鍵を共有する.$B$ は,チケット内の情報から $A$ の身元が分かる.また,$A$ が KDC
からの証明書を復号してチケットを取り出せたことから,チケットを送った相手が間違いなく $A$ であると分かる.
一方,$A$ は $B$ とセッション鍵を用いて正しく通信が行なえれば,$B$ が KDC が暗号化したチケットからセッション鍵を取り出せたことから,$B$ は目的の相手であることが分かる.
このように,第三者である KDC を介して相互認証することができる.
自分の秘密鍵乗して $p$ で割った余りを求めることで同じ鍵 $K_{AB}$ を共有することができる.
$K_{AB} = y_A^{x_B} \pmod{p} = y_B^{x_A} \pmod{p} = g^{x_A x_B} \pmod{p}$
上記の鍵共有は楕円曲線を用いても同様に実現できる.これを楕円DHと呼ぶ.$K_{AB} = x_B Y_A = x_A Y_B = x_A x_B P$
この方式においても,Alice と Bob との間で攻撃者 $X$ が通信を介在すれば,暗号鍵を共有できる.すなわち,$X$ は Alice と Bob との間に入り,Alice に対しては Bob になりすまし,Bob に対しては Aalice になりすますことにより,Alice,Bob 双方に対する共有鍵をもつことができる.この中間攻撃を防ぐには,Alice - Bob 間で認証を行えばよい (署名を付けて転送).$K_{AB} = (ID_B X_B^e)^{r_A} \bmod n = g^{r_A r_B e} \pmod{n}$
$K_{AB} = (ID_A X_A^e)^{r_B} \bmod n = g^{r_A r_B e} \pmod{n}$