鍵交換とハイブリッド暗号
Diffie-Hellman鍵交換とTLSが対称暗号方式と非対称暗号方式を組み合わせ、性能とセキュリティを両立する仕組みを学びます。
「鍵交換とハイブリッド暗号」はCoddyKit上の無料Cloud & IT Cert Prepレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCloud & IT Cert Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。
鍵交換の問題
共通鍵暗号では、両者が安全に通信する前に同じ秘密鍵を共有しておく必要があります。しかし、まだ安全な通信路がない場合、どうすればその鍵を安全に共有できるでしょうか。この鍵配送問題は、1976年にWhitfield DiffieとMartin Hellmanが画期的な論文を発表するまで、解決不可能だと考えられていました。2人の提案したDiffie-Hellman鍵交換により、盗聴者に見られる可能性のある安全でない通信路上でも、鍵そのものを送信せずに共有秘密鍵を確立できます。
Diffie-Hellman鍵交換の概念
Diffie-Hellman(DH)は、離散対数問題に基づく巧妙な数学的手法を使用します。両者は、2つの公開値(大きな素数pと生成元g)に合意します。各当事者は秘密の乱数を生成し、それを使って公開値を計算して交換します。その後、各当事者は、自分の秘密の数値と相手の公開値から同じ共有秘密を計算できます。一方、公開値しか見ていない盗聴者は、大きな数に対して計算上困難な離散対数問題を解かない限り、共有秘密を計算できません。
# Diffie-Hellman conceptual flow:
# 1. Agree on public parameters: prime p=23, generator g=5
# 2. Alice picks private a=6: computes A = g^a mod p = 5^6 mod 23 = 8
# 3. Bob picks private b=15: computes B = g^b mod p = 5^15 mod 23 = 19
# 4. Alice sends A=8 to Bob; Bob sends B=19 to Alice
# 5. Alice: s = B^a mod p = 19^6 mod 23 = 2
# 6. Bob: s = A^b mod p = 8^15 mod 23 = 2
# Shared secret = 2 (without either party transmitting it!)ECDH:楕円曲線Diffie-Hellman
楕円曲線Diffie-Hellman(ECDH)は、Diffie-Hellman鍵交換を現代向けに効率化した方式です。モジュラーべき乗の代わりに楕円曲線数学を使用し、より小さなパラメーターで同等のセキュリティを実現します。256ビットのECDH鍵は、3072ビットのDH鍵と同等のセキュリティを提供します。ECDHE(「E」はEphemeralの略)は、セッションごとに新しい鍵ペアを生成し、完全前方秘匿性を提供します。TLS 1.3では鍵交換にECDHEを使うことが必須となっており、現代のWebセキュリティで主流の鍵交換方式です。
完全前方秘匿性(PFS)
完全前方秘匿性(PFS)は、サーバーの長期的な秘密鍵が後から盗まれた場合でも、セッション鍵が漏えいしないことを保証します。PFSは、各セッションの鍵交換に一時鍵ペアを使用することで実現します。セッション鍵は一時的な鍵ペアから導出され、セッション終了後に破棄されます。PFSがない場合(RSA鍵交換を使用する場合)、攻撃者は今日暗号化トラフィックを記録し、後から秘密鍵を盗むことで、過去のすべての通信を遡って復号できます。PFSがあれば、鍵が侵害された後でも過去のセッションは安全に保たれます。
# Check if a website uses Perfect Forward Secrecy
openssl s_client -connect google.com:443 2>/dev/null | grep 'Cipher'
# Cipher : TLS_AES_256_GCM_SHA384 (TLS 1.3 - always has PFS)
# Or look for ECDHE in cipher name:
# Cipher : ECDHE-RSA-AES256-GCM-SHA384 (TLS 1.2 with PFS)
# DHE-RSA-AES256-GCM-SHA384 (DHE = also PFS)
# RSA-AES256-SHA (NO PFS - static RSA key exchange)ハイブリッド暗号:両方式の長所を活用
ハイブリッド暗号は、非対称暗号と対称暗号を組み合わせることで、非対称暗号の鍵管理上の利点と、対称暗号の性能の両方を実現します。手順は次のとおりです。(1) ランダムな対称セッション鍵を生成します。(2) この対称鍵を使って大量のデータを高速に暗号化します。(3) 受信者の公開鍵で対称鍵を暗号化し、安全に鍵を送信できるようにします。(4) 暗号化したデータと暗号化した鍵の両方を送信します。受信者は秘密鍵で対称鍵を復号し、復元した対称鍵でデータを復号します。
# Hybrid encryption example with OpenSSL
# 1. Generate a random AES-256 session key
openssl rand -out session.key 32
# 2. Encrypt the large file with the symmetric session key
openssl enc -aes-256-cbc -pbkdf2 -in largefile.tar -out largefile.enc -pass file:session.key
# 3. Encrypt the session key with recipient's RSA public key
openssl rsautl -encrypt -inkey recipient_public.pem -pubin -in session.key -out session.key.enc
# Send: largefile.enc + session.key.encTLSハンドシェイク:実際のハイブリッド暗号
TLSハンドシェイクは、現実のシステムで最も一般的に使われているハイブリッド暗号の実装です。TLS 1.3では、次のように処理します。(1) クライアントが、対応する暗号スイートと鍵共有情報(ECDHEの公開値)を送信します。(2) サーバーが、独自の鍵共有情報、証明書(公開鍵を含む)、および署名を返します。(3) 双方がECDHによって同じ共有秘密を計算します。(4) 以降のすべての通信を、共有秘密から導出した対称鍵(AES-256-GCM)で暗号化します。このプロセス全体により、対称鍵を直接送信することなく、1回のラウンドトリップで暗号化チャネルが確立されます。
# Observe the TLS 1.3 handshake
openssl s_client -connect example.com:443 -tls1_3
# You'll see:
# TLSv1.3, Handshake [length 0002], ServerHello
# Cipher : TLS_AES_256_GCM_SHA384
# Session-ID: (no session ID in TLS 1.3, uses PSK)
# Verify return code: 0 (ok)鍵カプセル化メカニズム(KEM)
現代の暗号技術では、セッション鍵を非対称暗号で直接暗号化する方法よりも、形式的で安全な鍵交換方式として鍵カプセル化メカニズム(KEM)が使われています。KEMを使うと、一方の当事者が対称鍵を生成し、受信者の公開鍵を使って、その受信者だけがデカプセル化(復元)できる形で鍵を「カプセル化」できます。NISTの耐量子計算機標準であるCRYSTALS-Kyberは、整数因数分解や楕円曲線ではなく格子問題に基づくKEMであり、量子コンピューターによる攻撃への耐性を備えています。
RSA鍵交換とECDHEの比較
TLS 1.3以前は、RSA鍵交換が一般的でした。クライアントがプレマスターシークレットを生成し、サーバーのRSA公開鍵で暗号化してサーバーに送信していました。この方式の問題は、前方秘匿性がまったくないことです。後からサーバーの秘密鍵が漏えいすると、この方式で暗号化された過去のすべてのセッションを復号できてしまいます。TLS 1.3では、すべての接続で前方秘匿性を確保するため、RSA鍵交換を完全に廃止し、ECDHEだけを許可しています。そのため、静的RSAを引き続き許可するTLS 1.0および1.2を無効にし、TLS 1.3を必須にすることは、セキュリティの向上につながります。
セッション鍵の導出
Diffie-Hellman交換で生成された共有秘密は、暗号化鍵として直接使用しません。代わりに、鍵導出関数(KDF)に入力して、実際の暗号化鍵と初期化ベクトルを生成します。TLS 1.3では、HKDF(HMACベースの鍵導出関数)を使い、通信の各方向の暗号化に別々の鍵を導出します。KDFには、計算コストを追加して総当たり攻撃を困難にすること、短い秘密から必要な長さの鍵バイト列を生成すること、導出した鍵が対称鍵として適切な優れた統計的性質を持つようにすること、という役割があります。
PGPメール暗号化:メールにおけるハイブリッド暗号
Pretty Good Privacy(PGP)と、そのオープンソース版であるOpenPGPは、メールにハイブリッド暗号を使用します。AliceがBobに暗号化メールを送信する場合、PGPはランダムな対称セッション鍵を生成し、その鍵でメール本文を暗号化し(AES)、BobのRSAまたはECC公開鍵でセッション鍵を暗号化して、両方をまとめて送信します。署名付きメールでは、PGPがメッセージをハッシュ化し、Aliceの秘密鍵でそのハッシュに署名します。これにより、否認防止が実現します。PGPの信頼の輪モデル(ユーザー同士が互いの鍵に署名する方式)は、認証局ベースのPKIに代わる方法です。
# Encrypt and sign an email file with GPG (OpenPGP)
# Encrypt to Bob using his public key, sign with Alice's private key
gpg --encrypt --sign --recipient bob@example.com --armor message.txt
# Decrypt (Bob uses his private key)
gpg --decrypt message.txt.asc
# List available keys
gpg --list-keys
gpg --list-secret-keys鍵交換における中間者攻撃のリスク
Diffie-Hellman鍵交換は受動的な盗聴者に対しては安全ですが、当事者同士が互いに認証しない場合、能動的な中間者(MITM)攻撃に対して脆弱です。攻撃者はAliceの公開値を傍受して自分の値に置き換え、AliceとBobそれぞれとの間に別々のDHセッションを確立できます。その結果、AliceもBobも相手と直接通信していると思い込んでしまいます。これが、TLSがDH鍵交換を証明書認証と組み合わせる理由です。信頼されたCAが署名したサーバーの証明書によってサーバーの身元が証明されるため、ハンドシェイク中に公開鍵が中間者によって置き換えられるのを防げます。
理解度チェック
このレッスンで扱ったCompTIA Security+(SY0-701)の概念について、理解度を確認しましょう。
レッスンのまとめ
このレッスンでは、Diffie-Hellmanによって、安全でないチャネル上でも当事者が共有秘密を導出でき、鍵交換の問題を解決できること、ECDHE(エフェメラル)によって完全前方秘匿性が実現すること、ハイブリッド暗号によって非対称鍵交換と大量データ向けの対称暗号を組み合わせ、効率を高められること、そしてTLS 1.3がすべての接続でECDHEを必須としていることを学びました。次は、認証局と信頼チェーンについて学びます。
よくある質問
「鍵交換とハイブリッド暗号」レッスンは無料ですか?
はい。「鍵交換とハイブリッド暗号」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cloud & IT Cert Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。
「鍵交換とハイブリッド暗号」で何を学びますか?
Diffie-Hellman鍵交換とTLSが対称暗号方式と非対称暗号方式を組み合わせ、性能とセキュリティを両立する仕組みを学びます。 ブラウザで直接実行するハンズオンコードでCloud & IT Cert Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cloud & IT Cert Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCloud & IT Cert Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「鍵交換とハイブリッド暗号」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCloud & IT Cert Prepレッスンでコードを書いて実行できますか?
はい。すべてのCloud & IT Cert Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 対称暗号アルゴリズム
- 非対称暗号と鍵ペア
- ハッシュとデータ完全性
- 鍵交換とハイブリッド暗号