エンドツーエンド暗号化と Signal プロトコル
通信路上のサーバを含む第三者が平文を読めないようにする暗号化方式。サーバは暗号文をリレーするだけで、鍵を持つ端末同士でしか復号できない。Signal / WhatsApp が代表例。_moc-cryptography
暗号の階層: プリミティブとプロトコル
- プリミティブ = 部品。ハッシュ(
SHA-3)、共通鍵暗号、署名など単機能の構成要素。 - プロトコル = それらを組み合わせた合意。
TLSやSignal等。- 例: Signal ≈
Curve25519(鍵交換) +AES-256/ChaCha20(暗号化) +HMAC-SHA256(認証)。
- 例: Signal ≈
C.I.A. トライアド
セキュリティの 3 目標。サイバー空間は敵対的(adversarial)前提で設計する。
- Confidentiality 機密性 / Integrity 完全性 / Availability 可用性
E2EE を構成する要素
- 非対称暗号 (公開鍵暗号): 公開鍵 pk と秘密鍵 sk のペア。ただし暗号化できる長さに制限があり低速。
- AEAD (認証付き暗号): 暗号化と改竄検知を同時に行う。例
XChaCha20-Poly1305= ストリーム暗号ChaCha20+ MACPoly1305、Xは extended nonce。→ symmetric-cipher-attacks - DH 鍵交換: 共有秘密を作る。現在は楕円曲線版
X25519が主流。→ ecdh-key-exchange - 署名: なりすまし防止。
Ed25519(エドワーズ曲線、)。 - KDF (鍵導出関数): パスワード等の秘密を PRF でマスターキー化。例
Blake2b(SHA-3 最終選考に残ったハッシュ)。
ハイブリッド暗号
公開鍵暗号は遅く短いメッセージしか扱えないため、現実には鍵交換でセッション鍵を作り、本文は AEAD で暗号化する。ephemeral(儚い)鍵を使い捨てにするのが要点。
前方秘匿性 (Forward Secrecy)
鍵が漏洩しても、漏洩以前に交換された通信は復号できないことを保証する性質。素朴な「鍵交換 + AEAD」だけだと sk 漏洩で過去全てが読まれる(PGP の弱点)。これを防ぐため鍵を継続的に更新する Double Ratchet Algorithm が Signal の核心。
E2EE 構築の役割分担(実装例)
| 役割 | アルゴリズム | 用いる鍵 |
|---|---|---|
| 署名 | Ed25519 | identity keypair |
| 暗号化 | XChaCha20-Poly1305 | (KDF 出力) |
| 鍵交換 | X25519 | prekey / ephemeral key |
| 鍵導出 | Blake2b | — |
identity_keypair(署名用)と prekey(鍵交換用)を登録し、メッセージごとに ephemeral 鍵で前方秘匿性を確保する。メモリ上の鍵は zeroize で使用後に消去する。
限界
- Replay 攻撃: 暗号文丸ごとの盗聴・再送には弱い。
- prekey のローテーション、prekey bundle の管理が必要。
関連
- black-hat-rust — 本トピックの出典(Ch.15)
- ecdh-key-exchange / public-key-cryptosystems / cryptographic-hash-functions