HPKE
これを理解しないとなぜこれを使っているのか、何が良いのか、何を問題としているのかが理解できないYudai.icon
抽象的かつ追い求めすぎないように理解するYudai.icon
chatGPT.icon
HPKE は、「公開鍵暗号」と「共通鍵暗号(対称鍵暗号)」を組み合わせた暗号方式を体系化したもの。 公開鍵暗号だけだと処理コスト・暗号文の長さなどに制限が出やすいので、実用性・効率性のために「ハイブリッド(=折衷・複合)」を用いる。
RFC 9180 はこの HPKE の定式化・標準化を目指した仕様を提示しており、さまざまな応用(TLS、メッセージング、安全なチャネル設計など)に使えるように設計されている。 さらに、認証付きモード(相手の正当性を確認できる仕組み)やプリシェア鍵(事前共有鍵)を併用するモードも定義しており、用途に応じた柔軟性を持たせている。
なぜ “ハイブリッド” な方式が必要か?
公開鍵暗号(たとえば RSA、楕円曲線暗号など)は、秘密鍵・公開鍵の組を使って、「公開鍵で暗号化」 → 「秘密鍵で復号」などの処理ができるという利点がある。この方式は鍵配布問題(共通鍵を安全に共有する問題)を解く鍵になる。
しかし、公開鍵暗号は計算コストが高く、大きなデータをそのまま暗号化するには効率が悪い。
一方、対称鍵暗号(AES 等)は処理速度が速く、大きなデータを暗号化するのに向いているが、鍵を安全に共有する手段が必要となる。
そこで一般的なアプローチが「ハイブリッド暗号方式」で、つまり:
1. 公開鍵暗号で “対称鍵(暗号鍵)” を安全に(鍵交換的に)共有する
2. その対称鍵で実際のデータを暗号化/復号する
書いてある感じだと自分が考えていたモデルな気がするがYudai.iconYudai.icon
This document describes a scheme for hybrid public key encryption (HPKE). … encrypted messages convey an encryption key encapsulated with a public key scheme, along with one or more arbitrary-sized ciphertexts encrypted using that key.”
=> 「暗号化鍵をカプセル化して運ぶ」+「その鍵でデータを暗号化する」方式
処理手順:
1.鍵カプセル化 (Encapsulation, Encap)
受信者の公開鍵を使って、ある「共有鍵(shared secret)」と「カプセル化データ(enc)」を生成する。
このカプセル化データを送ることで、受信者は自分の秘密鍵を使って shared secret を得られる。
2.鍵導出と暗号文コンテキスト生成 (Key Schedule / Setup)
shared secret や任意情報(info パラメータ)などを使って、実際に使う対称鍵や初期ノンス(nonce)・内部コンテキストを構築する。
3.データの対称鍵暗号化 (Seal / Open)
その対称鍵・ノンス・認証情報(AAD: Additional Associated Data など)を使って、データ(ペイロード)を暗号化(Seal)/復号(Open)する。
ここまでもそこまで考えていたことと相違はなさそうYudai.icon
モード名:
Base
最も基本的なモード。「公開鍵カプセル化 + 共通鍵暗号」で暗号化する。
PSK
事前共有鍵(Pre-Shared Key, PSK)を使って、追加の認証性やセキュリティ強化を行うモード。
多分このPSKってのを実装しているよねYudai.icon
Auth
送信者側に認証鍵 (公開鍵/秘密鍵) があって、それを使って「この暗号文をこの送信者が出した」ことを保証したいときに使う。
AuthPSK
PSK と送信者認証鍵の両方を併用するモード。
PSKとは?
Pre-Shared Key = 事前共有鍵
通信を始める前に、両者があらかじめ持っている共通の秘密。
例えば「初回の安全な鍵配布で共有しておいた鍵」や「物理的に渡した USB に入っている鍵」など。
HPKE の基本は「受信者の公開鍵を使って鍵カプセル化を行い、その鍵でデータを暗号化」ですが、PSK モードではそれに 追加の秘密(PSK) を混ぜることができます。
目的(なぜ PSK を使うのか)
1. セキュリティ強化(二重の安全性)
公開鍵暗号の仕組みが破られても、PSK が残っていれば通信の秘密は守られる。
逆に PSK が漏れても、公開鍵暗号部分があるので攻撃者はすぐには解読できない。
→ 二重ロックのようなイメージです。
2. 認証の補助
PSK を使うことで「相手が確かにこの秘密を知っている」という事前の確認が取れる。
これは「なりすまし」を防ぐのに有効。
3. 特定の利用シナリオへの対応
すでに別のチャネルや契約で秘密を共有している場合(VPN の設定ファイル、SIM カードの中のキーなど)、それを活用してセッションを強化できる。
IoT やリソースが限られたデバイスでは、PSK を使う方が効率的な場合もある。
疑問点
たださこれさbaseモードと比較してある意味通信回数は2回増えますよね??相手側からpreとして追加の秘密を生成してもらう必要があるので。通常ならば相手の鍵を暗号化し、一度通信すれば良いと思うので。
A. 結論から言うと HPKE の PSK モードは「追加の通信回数」を発生させない 仕組みになっています。つまり Base モードと同じ 1 ラウンド(送信者→受信者に暗号文を送るだけ)で済む んです。
ほう!?!?Yudai.icon
PSK モード: 「南京錠を相手の公開鍵で閉じて送る」+「でも南京錠を開けるには、あらかじめ合言葉(PSK)を知っていなきゃいけない」南京錠を送る通信は 1回 で済みます。
ただし その前に二人がどこかで同じ合言葉を取り決めている必要がある、というだけです。
ってことは毎回生成ではないがローテンションはどこかで必要?
RFC 9180 の仕様上は「PSK のローテーションを必須とはしていない」けど、セキュリティ実務上はローテーションを推奨されます。
まあ、そりゃそうYudai.icon
問題:
HPKE の Base モードは「新しく生成した鍵カプセル化(Encap)」に依存するので前方秘匿性が得やすい。
あーなるほど?毎回コンテンツ毎に鍵の生成をするとも言えるもんねYudai.icon
でも PSK は固定された秘密なので、もし PSK が漏れたら過去の通信まで危険にさらされる。
これを防ぐには定期的に更新するしかない。
む、じゃあなおさらPSKを使おうとした意図が気になるYudai.icon*3