ハイブリッド暗号と KEM-DEM の原理
公開鍵で大きなデータを暗号化できない理由が腑に落ちる。公開鍵で共通鍵を封じる KEM と対称暗号 DEM の二段構成、ECIES/HPKE の構造、PQC への素直な適合まで原理から押さえられる。
- 1.ハイブリッド暗号は KEM(公開鍵で対称鍵を封じる)と DEM(その対称鍵で実データを AEAD 暗号化する)の二段構成。公開鍵暗号は鍵共有だけに使い、データ本体は高速な共通鍵暗号で守る。
- 2.公開鍵で直接データを暗号化しないのは、RSA-OAEP では平文がモジュラスサイズ未満に制限されること、公開鍵演算が桁違いに遅いこと、教科書 RSA や生の DH をそのままパディングなしで使うと安全性が崩れることが理由。
- 3.ECIES は ECDH 共有値を KDF で対称鍵に変換し AEAD で封じる古典構成、HPKE(RFC 9180)はそれを KEM 抽象で再定義した現代版。KEM 部を ML-KEM に差し替えるだけで PQC へ移行でき、ハイブリッド KEM も組める。
ハイブリッド暗号が解く問題:公開鍵でデータを直接暗号化しない
公開鍵暗号を学ぶと、まず「受信者の公開鍵で平文を暗号化し、受信者が秘密鍵で復号する」という素朴な絵を描きます。ところが実運用のプロトコル(TLS・PGP・暗号化メッセージング)は、ほぼ例外なくこの素朴な絵を採りません。実際に使われるのはハイブリッド暗号(hybrid encryption)、すなわち公開鍵暗号で「共通鍵を一本だけ安全に運び」、データ本体は共通鍵暗号で暗号化する二段構えです。
なぜ公開鍵で直接データを暗号化しないのか。理由は三つに集約されます。
(1) サイズ制限:RSA-OAEP で一度に暗号化できる平文は、モジュラスのバイト長からパディング分を引いた長さ未満に限られる(2048 ビット鍵なら高々 190 バイト前後)。長い平文は分割が必要で非現実的。 (2) 速度:公開鍵演算(モジュラ冪乗や楕円曲線スカラー倍)は対称暗号より数百〜数千倍遅い。メガバイト級のデータを公開鍵で直接暗号化すれば処理が破綻する。 (3) 安全性:パディングなしの教科書 RSA は決定的で、同じ平文が同じ暗号文になり、可換性などの代数的性質から平文を漏らす。生の公開鍵暗号を長いデータに繰り返し適用する設計は、構造上ほぼ必ず破れる。
ハイブリッド暗号はこの三つを一挙に回避します。公開鍵暗号が運ぶのは数十バイトの対称鍵だけなのでサイズも速度も問題にならず、データ本体は完全性まで守るAEAD(認証付き暗号)で暗号化します。重い公開鍵演算は鍵共有の一回きり、残りは高速な共通鍵暗号——これはエンベロープ暗号化が KMS のマスター鍵とデータ鍵を分けたのと同じ「鍵を運ぶ層」と「データを守る層」の分離思想です。
KEM-DEM:鍵を封じる層とデータを守る層
この二段構成を厳密な抽象として定式化したのが KEM-DEM パラダイムです。Cramer と Shoup が整理した枠組みで、ハイブリッド暗号を二つの独立した部品の合成として定義します。
| 部品 | 正式名 | 鍵 | 役割 | 実体の例 |
|---|---|---|---|---|
| KEM | Key Encapsulation Mechanism | 公開鍵/秘密鍵 | ランダムな対称鍵を生成し、公開鍵で封じる(カプセル化) | RSA-KEM, DHKEM, ML-KEM |
| DEM | Data Encapsulation Mechanism | 対称鍵(KEM の出力) | その対称鍵で実データを暗号化・認証する | AES-GCM, ChaCha20-Poly1305 |
KEM のインターフェースが鍵抽象の核心です。「平文を受け取って暗号化する」のではなく、KEM 自身がランダムな対称鍵を内部で生成して返す点が決定的に違います。
KEM の三つの操作:
KeyGen() -> (公開鍵 pk, 秘密鍵 sk)
Encap(pk) -> (K, c)
K = ランダムに導出された対称鍵(送信側に返る)
c = K を pk で封じたカプセル(暗号文として送る)
Decap(sk, c) -> K
受信側が sk で c を開き、同じ K を取り戻す
Encap が対称鍵 K とカプセル c を同時に返すことに注目してください。送信側は K で DEM を回し、受信側へは c だけを送る。受信側は秘密鍵で c を Decap し、まったく同じ K を復元する。これはKMS の GenerateDataKey が平文データ鍵とラップ済みデータ鍵を一度に返す構造と瓜二つで、KEM はいわば「公開鍵版の GenerateDataKey」です。全体の暗号化はこう組み上がります。
ハイブリッド暗号化(送信側):
1. (K, c) = KEM.Encap(受信者の pk)
2. ct = DEM.Enc(K, 平文データ) # AES-GCM 等の AEAD
3. K をメモリから破棄
4. 送信: { c, ct }
復号(受信側):
1. K = KEM.Decap(sk, c)
2. 平文 = DEM.Dec(K, ct)
KEM-DEM の理論的な美点は、KEM が IND-CCA 安全かつ DEM が認証付きなら、合成したハイブリッド暗号も IND-CCA 安全になるという合成定理が成り立つことです。鍵を運ぶ部分とデータを守る部分を別々に設計・証明し、最後に貼り合わせられる。これが「公開鍵で直接データを暗号化する」モノリシックな設計より、はるかに見通しよく安全性を組み立てられる理由です。
ECIES:ECDH を KEM 化した古典構成
KEM-DEM の具体例として最も理解しやすいのが **ECIES(Elliptic Curve Integrated Encryption Scheme)**です。土台は楕円曲線 Diffie-Hellman(ECDH)。鍵共有プロトコルである DH を、片側だけが固定鍵を持つ「一方向の鍵封じ」に転用したものと見ると本質が掴めます。
ECIES の Encap(送信側、受信者の公開鍵 pk = Q を持つ):
1. 一時鍵ペア (r, R=r·G) を生成 # エフェメラル ECDH 鍵
2. 共有点 S = r·Q = r·(d·G) # d は受信者の秘密鍵
3. K = KDF(S の x 座標) # 共有値を対称鍵へ変換
4. カプセル c = R(送信側の一時公開鍵)
Decap(受信側、秘密鍵 d):
1. S = d·R = d·(r·G) = r·(d·G) # 同じ共有点に到達
2. K = KDF(S の x 座標) # 同じ K を復元
送信側が毎回エフェメラル(使い捨て)鍵ペアを作り、受信者の固定公開鍵との ECDH で共有点を得ます。この共有点はそのままでは対称鍵に使えない(部分情報が偏り、ビット長も合わない)ため、必ず鍵導出関数 KDF(HKDF)を通して一様な対称鍵へ均します。生の DH 共有値を直接 AES 鍵にしてはいけない——これが ECIES が「Integrated」と名乗る所以で、ECDH・KDF・AEAD を正しく統合した点に価値があります。
教科書 RSA を OAEP なしで、あるいは生の DH 共有点をパディングや KDF なしで対称鍵に流用する実装は、決定性・代数構造・小部分群攻撃などで破れます。KEM-DEM はこれらを防ぐために、KEM 内部で必ず KDF と適切なパディング/変換を噛ませます。「公開鍵演算の生の出力をそのまま鍵やデータに使わない」が鉄則です。
HPKE:KEM 抽象で再定義した現代版と PQC 適合
ECIES は曲線・KDF・AEAD の組み合わせが乱立し相互運用が難しい弱点がありました。これを KEM-DEM の抽象に沿って厳密に標準化したのが **HPKE(Hybrid Public Key Encryption, RFC 9180)**です。HPKE は処理を KEM × KDF × AEAD の三つの差し替え可能な部品(cipher suite)に分解し、各々を識別子で指定します。
| 構成要素 | 担当 | 代表的な選択肢 |
|---|---|---|
| KEM | 対称鍵のカプセル化 | DHKEM(X25519), DHKEM(P-256), ML-KEM-768 |
| KDF | 共有値→対称鍵の導出 | HKDF-SHA256, HKDF-SHA512 |
| AEAD | データの暗号化・認証(DEM) | AES-128-GCM, ChaCha20-Poly1305 |
HPKE が ECDH を DHKEM という KEM として抽象化したことの意味は、KEM 部品だけを丸ごと差し替えられる点にあります。ここにポスト量子暗号(PQC)が素直に接続します。量子計算機は ECDH や RSA の土台である離散対数・素因数分解を破りますが、HPKE の DEM 側(AES-GCM 等の対称暗号)は鍵長を倍にすれば量子耐性を保てます。脅威は KEM 側に集中するため、対策は明快です——DHKEM(X25519) を格子ベースの ML-KEM(旧 CRYSTALS-Kyber, FIPS 203)に置き換えるだけで、DEM もプロトコル全体も触らずに PQC 化できます。
PQC アルゴリズムは比較的新しく、未知の解読が見つかる懸念が残ります。そこで移行期には、古典 KEM(X25519)と PQC KEM(ML-KEM)の両方で対称鍵を導出し、両者の共有値を KDF で結合するハイブリッド KEM(例 X25519MLKEM768)が使われます。どちらか一方が破られても、もう一方が無事なら鍵は守られる。これも KEM-DEM の「KEM 部を組み替えられる」抽象があってこそ自然に実現します。
PQC への移行で KEM だけを差し替えれば済むのは、KEM-DEM がそもそも「鍵を運ぶ層」と「データを守る層」を分離していたからです。データ本体を公開鍵で直接暗号化する設計だったら、量子耐性を得るために暗号システム全体を作り直す羽目になっていたでしょう。
まとめ
ハイブリッド暗号の本質は、公開鍵暗号は対称鍵を一本運ぶためだけに使い、データ本体は共通鍵暗号で守る役割分担です。公開鍵で直接データを暗号化しないのは、サイズ制限・速度・安全性の三つの壁があるためで、KEM-DEM はこれを「対称鍵を封じる KEM」と「データを暗号化する DEM」の合成として厳密に定式化します。KEM は公開鍵版の鍵生成器であり、Encap が対称鍵とカプセルを同時に返す構造が起点です。
ECIES は ECDH 共有値を KDF で対称鍵に変え AEAD で封じる古典構成、HPKE はそれを KEM × KDF × AEAD の差し替え可能な抽象に再定義した現代版です。KEM 部を ML-KEM へ差し替えるだけで PQC へ移行でき、移行期にはハイブリッド KEM で古典と PQC を二重化できます。鍵を運ぶ層とデータを守る層を分けておく——この分離こそが、性能と安全性、そして量子時代への移行可能性を同時に手に入れる設計原理です。
セキュリティ Article
ハイブリッド暗号と KEM-DEM の原理を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
ハイブリッド暗号
比較で見る軸
難易度: advanced / カテゴリ: セキュリティ / タグ数: 6
導入後に効く点
公開鍵で直接データを暗号化しないのは、RSA-OAEP では平文がモジュラスサイズ未満に制限されること、公開鍵演算が桁違いに遅いこと、教科書 RSA や生の DH をそのままパディングなしで使うと安全性が崩れることが理由。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- セキュリティ
- タグ数
- 6
判断チェックリスト
- 自社の用途が「ハイブリッド暗号 / KEM」に近いか確認する。
- 強みである「ハイブリッド暗号は KEM(公開鍵で対称鍵を封じる)と DEM(その対称鍵で実データを AEAD 暗号化する)の二段構成。公開鍵暗号は鍵共有だけに使い、データ本体は高速な共通鍵暗号で守る。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。