この暗号化手法では、2 つの定数 PROOT と HEXMODULUSを使用します。DES 認証プロトコルでは、この 2 つの定数として次の値を使用します。
const PROOT = 3; const HEXMODULUS = /* 16 進 */ "d4a0ba0250b6fd2ec626e7efd637df76c716e22d0944b88b";
この暗号化手法は次の例で説明するとわかりやすいでしょう。ここに A と B という 2 人の人が互いに暗号化したメッセージを送信するとします。Aと B はそれぞれランダムに秘密キーを生成し、このキーは誰にも教えません。秘密キーをそれぞれ SK(A) と SK(B) とします。また、2 人は公開ディレクトリにそれぞれ公開キーを示します。公開キーは次のように計算されます。
PK(A) = (PROOT ** SK(A)) mod HEXMODULUS PK(B) = (PROOT ** SK(B)) mod HEXMODULUS
** という記号はべき乗を表します。
ここで A と B は、互いに秘密キーを知らせ合うことなく 2 人の間の共通キー CK(A,B) を求めることができます。
A は次のように計算します。
CK(A, B) = (PK(B) ** SK(A)) mod HEXMODULUS
B は次のように計算します。
CK(A, B) = (PK(A) ** SK(B)) mod HEXMODULUS
上の 2 つの式から次の等式が得られます。
(PK(B)**SK(A)) mod HEXMODULUS = (PK(A)**SK(B)) mod HEXMODULUS
ここで、mod HEXMODULUS という部分を両辺から取り除いてモジュロ計算を省略し、プロセスを簡単にします。
PK(B) ** SK(A) = PK(A) ** SK(B)
次に、PK(B) を先に B が計算した値で置き換えます。PK(A) も同様に置き換えます。
((PROOT ** SK(B)) ** SK(A) = (PROOT ** SK(A)) ** SK(B)
この式は次のように書き換えられます。
PROOT ** (SK(A) * SK(B)) = PROOT ** (SK(A) * SK(B))
共通キー CK(A,B) は、プロトコルで使用されるタイムスタンプの暗号化には使用しません。共通キーは会話キーの暗号化にだけ使用し、タイムスタンプの暗号化には会話キーを使用します。これは、共通キーを使用する回数をできるだけ少なくして、共通キーが破られないようにするためです。会話時間は比較的短いため、会話キーの方が破られる心配がずっと少ないからです。
会話キーは、56 ビットの DES キーを使用して暗号化します。共通キーは 192 ビットですので、共通キーから次のようにして 56 ビットを選択し、ビット数を減らします。共通キーから中央の 8 バイトを選択し、各バイトの下位ビットにパリティを加えます。こうして、8 ビットのパリティの付いた 56 ビットキーが生成されます。