Contents
1. エンドツーエンド暗号化 (E2E) の基本概念と Proton Mail の位置付け
E2E 暗号化とは、送信者のデバイスで暗号化されたデータが受信者のデバイスで復号されるまで、途中にあるサーバやネットワーク機器が平文を見ることができない 仕組みです。Proton Mail はこの概念を「ゼロ知識(Zero‑Knowledge)」という形で実装しています。
- 公式解説: Proton のセキュリティページは E2E を次のように定義しています → proton.me/ja/security/end-to-end-encryption
- 「メール本文・添付ファイルは送信時にクライアント側で暗号化され、サーバ上では暗号文として保存」
- 暗号方式は AES‑256 GCM(データ)+ RSA‑2048/4096 または ECC(キー交換)
ゼロ知識とは何か
Proton の「ゼロ知識」は、サーバがユーザーの復号鍵に一切アクセスできない ことを保証する実装です。公式 FAQ にも次のように記載されています → proton.me/ja/support/zero-knowledge
| 項目 | E2E の概念 | Proton Mail のゼロ知識実装 |
|---|---|---|
| 鍵の保管先 | ユーザーが全て保持(デバイスまたは外部キーストア) | 鍵はユーザー端末に保存、サーバには送信されない |
| サーバ側の可視性 | 暗号文のみ保存・転送 | 同上。復号鍵は一切保持しない |
| 外部受信者への対応 | OpenPGP で手動暗号化が必要 | パスワード保護メール(自動)または OpenPGP 手動 |
2. Proton Mail が自動的に暗号化する対象とプラン別制限
暗号化の対象(公式情報)
| 対象 | 暗号化方式・適用範囲 | 公式根拠 |
|---|---|---|
| 本文 | OpenPGP 互換の AES‑256 GCM によるエンドツーエンド暗号化 | Security – E2E |
| 添付ファイル | メール本文と同様にクライアント側で暗号化し、サーバへは暗号文だけが保存 | 同上 |
| パスワード保護メール(外部受信者) | 送信者が設定したパスフレーズで AES‑256 暗号化し、リンクと有効期限を別途通知 | Support – Password‑protected messages |
添付サイズ上限(公式プランページ)
| プラン | 最大添付サイズ(暗号化前) | 暗号化後の実質的上限* |
|---|---|---|
| 無料 (Free) | 25 MB | 約 24 MB (暗号化に伴うオーバーヘッド ≈ 1 MB) |
| Plus / Professional | 50 MB | 約 48 MB |
| Visionary(有料最高位) | 100 MB | 約 96 MB |
*※暗号化後はデータが数%増えるため、実際に送信できるサイズは若干小さくなります。公式プラン一覧 → proton.me/ja/pricing
暗号化アルゴリズムの詳細
- 対称鍵: AES‑256 GCM(認証付き暗号)
- 公開鍵: RSA‑2048(デフォルト)または RSA‑4096/ECC(オプション)
- キー交換: ECDH (Curve25519) が利用可能(Proton Bridge でも同様)
公式ドキュメントの「Encryption details」セクションに記載があります → proton.me/ja/security/encryption-details
3. 開発者向け:Proton Bridge と API の利用手順
3‑1. Bridge の概要と公式ダウンロード先
Proton Bridge は ローカルで動作する SMTP/IMAP プロキシ です。クライアントは普通のメールサーバーと同様に接続でき、Bridge が自動的に暗号化・復号を行います。
- ダウンロードページ: protonapps.com/bridge(Windows/macOS/Linux 各版)
- インストール後の初回起動で Proton アカウントと 2FA を入力すれば、ローカルポートが自動割り当てされます(デフォルトは
localhost:1025(SMTP) とlocalhost:1143(IMAP))。
3‑2. 手順を箇条書きでまとめる
- アカウント作成
-
Web UI → https://account.proton.me/signup(無料プランでも Bridge は使用可能)
-
Bridge の取得・インストール
-
上記ダウンロードページから OS に合ったパッケージを入手し、画面の指示に従ってインストール。
-
アカウント認証
-
Bridge 起動時にメールアドレス、パスワード、2FA コード(TOTP)を入力。認証が成功するとローカルエンドポイントが有効化されます。
-
SMTP/IMAP 設定の確認
-
Bridge > Settingsでポート番号や TLS の有無を確認できる。デフォルト設定はそのままで問題ありません。 -
クライアントから接続
- 任意のメールクライアント(Thunderbird、Outlook 等)に「ローカルサーバー」情報を入力し、認証情報は不要です(Bridge が代行)。
3‑3. Python で Bridge 経由にメール送信する例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import smtplib, ssl from email.message import EmailMessage msg = EmailMessage() msg["From"] = "alice@protonmail.com" msg["To"] = "bob@example.org" msg.set_content("Proton Bridge 経由のテストメールです。") # Bridge のローカル SMTP (TLS は Bridge が内部で処理) with smtplib.SMTP("localhost", 1025) as smtp: smtp.send_message(msg) print("✅ メール送信完了") |
ポイント
- 認証情報は不要(Bridge が事前に認証済み)
- TLS は Bridge 側で自動的に確立されるため、クライアント側は平文の SMTP コマンドを使用できる
4. 外部受信者向け暗号化オプション(OpenPGP とパスワード保護メール)
4‑1. 公式が推奨する2つの方法
| 方法 | 利点 | 欠点・留意点 |
|---|---|---|
| パスワード保護メール(Proton の機能) | ユーザーは追加設定不要で送信可能。受信者はリンクとパスフレーズだけで復号できる。 | パスフレーズを別途共有する必要がある。 |
| OpenPGP 手動暗号化(外部鍵交換) | 完全な公開鍵ベースの E2E。キー管理が明示的になる。 | 受信者側も OpenPGP 対応クライアントが必須。設定がやや複雑。 |
公式マニュアル → proton.me/ja/support/encrypting-messages
4‑2. Python (python-gnupg) で OpenPGP 暗号化するサンプル
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import gnupg, os # GnuPG のホームディレクトリを分離(例: ~/.gnupg_proton) gpg_home = os.path.expanduser("~/.gnupg_proton") gpg = gnupg.GPG(gnupghome=gpg_home) # 受信者の公開鍵をインポート(事前に取得済みとする) with open("bob_public.asc", "rb") as f: gpg.import_keys(f.read()) plaintext = "機密情報:プロジェクトXの設計図" encrypted = gpg.encrypt( plaintext, recipients=["bob@example.org"], always_trust=True # 公開鍵が自己署名でも受け入れる ) print("-----BEGIN PGP MESSAGE-----") print(str(encrypted)) |
4‑3. OpenPGP.js(ブラウザ/Node)での暗号化例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import * as openpgp from 'openpgp'; // 公開鍵(ASCII アーマー形式)を取得 const publicKeyArmored = `-----BEGIN PGP PUBLIC KEY BLOCK----- ... -----END PGP PUBLIC KEY BLOCK-----`; async function encryptMessage(message) { const publicKey = await openpgp.readKey({ armoredKey: publicKeyArmored }); const encrypted = await openpgp.encrypt({ message: await openpgp.createMessage({ text: message }), encryptionKeys: publicKey, // 大容量ファイルはストリーム API を利用 }); console.log(encrypted); // ASCII アーマー形式の暗号文 } encryptMessage('機密情報:プロジェクトX'); |
実装上の注意
- 暗号化後のデータサイズは元データの約 1.3 倍になるため、Proton Bridge の添付制限に引っ掛かる可能性があります。
- 大容量ファイルは ストリーミング暗号化(openpgp.createMessage({ binary: stream }))を推奨します。
5. セキュリティベストプラクティスとテスト手順
5‑1. 暗号化メールがサーバ上で平文になっていないか確認する方法
- メール送信 – 前節の Python スクリプトで自分宛に暗号化メールを送る。
- Bridge のログ取得 –
~/.config/ProtonMail/Bridge/logs/bridge.logにDATAコマンド以下のペイロードが出力されます。次の文字列が含まれているか検索してください。
bash
grep "BEGIN PGP MESSAGE" ~/.config/ProtonMail/Bridge/logs/bridge.log
- Web UI で確認 – Proton の Web クライアントを開き、対象メールの本文が「暗号化されたメッセージ」と表示されているか目視。
判定基準
-BEGIN PGP MESSAGEがログにのみ出力され、平文テキストは見当たらない → 正常
- 平文の一部が残っている → Bridge の設定ミスまたは古いクライアント使用の可能性あり
5‑2. 鍵管理と二要素認証(2FA)のベストプラクティス
| 項目 | 推奨策 | 参考公式ページ |
|---|---|---|
| 秘密鍵保管 | OS キーストアまたはハードウェアトークン (YubiKey) に保存し、パスフレーズで暗号化 | proton.me/ja/support/key-management |
| パスフレーズ管理 | 信頼できるパスワードマネージャーに保存し、マスターパスワードは 12 文字以上のランダム文字列 | 同上 |
| 二要素認証 (2FA) | TOTP(Google Authenticator, Authy 等)を必須化。SMS 認証は非推奨 | proton.me/ja/support/two-factor-authentication |
| 鍵ローテーション | 12〜18 カ月ごとに新鍵ペアを生成し、古い公開鍵は受信者側へ通知して廃棄 | 同上 |
5‑3. 大容量添付ファイルの取り扱い
- プラン別上限(再掲)
- 無料: 25 MB
- Plus/Professional: 50 MB
-
Visionary: 100 MB
-
実務的な回避策
- Proton Drive にアップロード → 共有リンクをパスワード保護メールで通知(暗号化はリンク先のファイルに適用)。
-
ファイルを 分割圧縮 (ZIP/7z) し、各パーツが上限内になるように調整。
-
モバイル復号時の遅延対策
- OpenPGP.js の WebAssembly ビルドと
openpgp.config.useWebWorker = trueを有効化すると CPU 使用率が低減し、UI がフリーズしにくくなります。
|
1 2 3 |
import * as openpgp from 'openpgp'; openpgp.config.useWebWorker = true; // 非同期処理で UI への負荷を分散 |
まとめ
- E2E 暗号化 は公式が保証する「本文・添付・パスワード保護メール」のすべてに適用され、サーバは暗号文しか保持しません(Zero‑Knowledge)。
- プラン別の添付上限 と 暗号化後サイズ増加 を正確に把握し、必要に応じて Proton Drive へオフロードする設計が推奨されます。
- Proton Bridge を用いれば既存のメールクライアントやスクリプトから手軽に暗号化メールを送受信でき、実装は数行のコードで完結します。
- 外部受信者向けには パスワード保護メール と OpenPGP 手動暗号化 の2択があり、要件に合わせて使い分けます。
- テストと鍵管理 を徹底し、ログで暗号文だけが送受信されていることを確認すれば、実装の安全性は高く保たれます。
以上を参考に、Proton Mail のエンドツーエンド暗号化を正しく活用してください。