概要
ハイブリッド暗号は「公開鍵暗号で共通鍵を安全に交換し、実際のデータは共通鍵暗号で暗号化する」方式です。公開鍵暗号の鍵配送安全性と、共通鍵暗号の処理速度を組み合わせた実用的なアプローチであり、TLS・S/MIME・PGP など実際に使われる暗号システムのほぼすべてに採用されています。
仕組みと動作原理
なぜハイブリッドが必要か
| 方式 | 長所 | 短所 |
|---|---|---|
| 公開鍵暗号のみ | 鍵配送が安全 | 低速(RSAは共通鍵暗号の1000倍遅い) |
| 共通鍵暗号のみ | 高速 | 鍵配送が問題(安全に鍵を渡す手段が必要) |
| ハイブリッド暗号 | 安全な鍵配送+高速処理 | 実装が複雑 |
ハイブリッド暗号の基本フロー
【送信者】
1. 使い捨てセッション鍵(AES鍵など)をランダム生成
2. セッション鍵を受信者の公開鍵で暗号化(RSA-OAEP または ECIES)
3. 実際のデータをセッション鍵で暗号化(AES-GCM など)
4. 暗号化されたセッション鍵 + 暗号化データを送信
【受信者】
5. 自分の秘密鍵で暗号化されたセッション鍵を復号
6. 取得したセッション鍵で暗号化データを復号
TLSにおけるハイブリッド暗号
TLS 1.2(RSA鍵交換)
1. サーバが公開鍵証明書を送付
2. クライアントが PreMasterSecret(48バイトの乱数)を生成
3. サーバの公開鍵で PreMasterSecret を暗号化して送付
4. 両者が PreMasterSecret からセッション鍵を導出
5. 以降はセッション鍵(AES等)で通信
※ PFS(前方秘匿性)がない。サーバ秘密鍵漏洩で過去通信も解読可能。
TLS 1.3(ECDHE + HKDF)
1. ECDHE で共通秘密(Shared Secret)を導出
2. HKDF(鍵導出関数)で複数のセッション鍵を生成
3. AES-GCM 等で通信
※ PFS あり。セッションごとにECDHEの鍵ペアを生成・破棄。
KEM(Key Encapsulation Mechanism)
現代の暗号設計で使われる抽象化された概念です。
KEM.Encap(公開鍵) → (暗号文, 共通鍵) ← 送信者が実行
KEM.Decap(秘密鍵, 暗号文) → 共通鍵 ← 受信者が実行
RSA-OAEP・ECDH どちらも KEM の一種として捉えられます。耐量子暗号(PQC)でも KEM が主要な設計パターンです。
S/MIMEとPGPでの利用
| 用途 | 仕組み |
|---|---|
| S/MIME(メール暗号化) | 受信者の証明書(公開鍵)でセッション鍵を暗号化 → メール本文を暗号化 |
| PGP/GPG | 受信者の公開鍵でセッション鍵を暗号化(同様の構造) |
SC試験での頻出ポイント
- ハイブリッド暗号を使う理由:公開鍵暗号は低速なのでデータを直接暗号化せず、セッション鍵の配送にのみ使う
- TLS 1.2とTLS 1.3の鍵交換の違い:1.2はRSA(PFSなし)またはDHE/ECDHE、1.3はECDHE/DHE必須(PFS強制)
- セッション鍵を使い捨てにする理由:1セッションの鍵漏洩が他のセッションに影響しないようにする
- RSA-OAEPとは:RSAに安全なパディングを追加した現代的な暗号化方式(古いPKCS#1 v1.5は脆弱)
- KEM(鍵カプセル化)の概念:共通鍵を「包んで」安全に配送する抽象化されたメカニズム
よくある誤問・ひっかけパターン
誤り① 「TLSでは公開鍵暗号でデータを直接暗号化している」→ 誤。公開鍵暗号はセッション鍵の交換にのみ使い、データは共通鍵で暗号化します。
誤り② 「セッション鍵は毎回同じものを再利用してもよい」→ 誤。セッションごとに新しい鍵を生成することで、1つの鍵漏洩の影響範囲を限定します。
誤り③ 「TLS 1.3ではRSA鍵交換を使える」→ 誤。TLS 1.3はRSA鍵交換を廃止し、ECDHE/DHEによるPFS必須です。
関連用語
- 共通鍵暗号(AES)と動作モード — ハイブリッド暗号でデータ暗号化に使用
- 公開鍵暗号(RSA)とデジタル署名 — セッション鍵の暗号化に使用
- 楕円曲線暗号(ECC) — TLS 1.3のECDHEに使用
- TLS(Transport Layer Security) — ハイブリッド暗号の典型的な実装例
重要キーワード
| 用語 | 説明 |
|---|---|
| ハイブリッド暗号 | 公開鍵暗号と共通鍵暗号を組み合わせた方式 |
| セッション鍵 | 一時的な共通鍵。通信ごとに生成・破棄 |
| KEM | 鍵カプセル化機構。共通鍵を安全に配送するための抽象化 |
| RSA-OAEP | 現代的なRSA暗号化パディング方式 |
| HKDF | 鍵導出関数。1つの共通秘密から複数の鍵を安全に生成 |
| PreMasterSecret | TLS 1.2でクライアントが生成するセッション鍵の元になる値 |