共通シークレットの計算
これは最後にして最も重要なステップです。ここでは、両当事者がそれぞれ自身の秘密鍵と相手の公開鍵を使用して、独立して共有シークレットを計算します。プロトコルが成功した場合、両者は全く同じシークレット値に到達します。
まず、パーティ A の観点から共有シークレットを計算します。パーティ A は自身の秘密鍵(a_private_key.pem)とパーティ B の公開鍵(b_public_key.pem)を使用します。
以下のコマンドを実行します。
openssl pkeyutl -derive -inkey a_private_key.pem -peerkey b_public_key.pem -out a_shared_secret.bin
pkeyutl: 公開鍵操作を実行するためのユーティリティです。
-derive: このアクションは、ユーティリティに共有シークレットを導出するように指示します。
-inkey a_private_key.pem: パーティ A 自身の秘密鍵を指定します。
-peerkey b_public_key.pem: 相手(「ピア」)の公開鍵を指定します。
-out a_shared_secret.bin: 結果のバイナリシークレットをファイルに保存します。
次に、パーティ B の観点から共有シークレットを計算します。パーティ B は自身の秘密鍵(b_private_key.pem)とパーティ A の公開鍵(a_public_key.pem)を使用します。
以下のコマンドを実行します。
openssl pkeyutl -derive -inkey b_private_key.pem -peerkey a_public_key.pem -out b_shared_secret.bin
これで、a_shared_secret.bin と b_shared_secret.bin という二つのファイルができました。鍵交換の成功を検証するには、これら二つのファイルが同一でなければなりません。これを確認するために cmp (compare) コマンドを使用できます。
cmp a_shared_secret.bin b_shared_secret.bin
ファイルが同一であれば、このコマンドは何も出力せずサイレントに終了します。この沈黙は成功を意味します!
視覚的に確認するために、両ファイルの暗号学的ハッシュを計算することもできます。ハッシュは一致しなければなりません。
sha256sum *.bin
両ファイルが全く同じ SHA256 ハッシュを持つ出力が表示されるはずです。実際のハッシュ値は実行ごとに異なりますが、両ファイルで同一であることが重要です。
e3705a4ab5ae5d86f59dfe968f0177b49d5144e2d731dbd8d41b2eda318412ec a_shared_secret.bin
e3705a4ab5ae5d86f59dfe968f0177b49d5144e2d731dbd8d41b2eda318412ec b_shared_secret.bin
(注:あなたのハッシュ値はこの例とは異なりますが、重要なのは a_shared_secret.bin と b_shared_secret.bin のハッシュが同一であり、両当事者が同じ共有シークレットを導出したことを証明している点です。)
おめでとうございます、Diffie-Hellman 鍵交換を正常に実行できました!