ここで紹介するのは設計の考え方です。実運用では、独自の暗号方式を実装せず、検証済みのライブラリとプロトコルを使ってください。RSAで大きなファイルを直接暗号化する方式は、一般的な選択ではありません。
大容量ファイルの暗号化では、通常、**共通鍵暗号(AESやChaCha20)と公開鍵暗号(RSAや楕円曲線暗号)**を組み合わせます。共通鍵暗号は大量データを高速に処理し、公開鍵暗号は共通鍵を安全に受け渡すために使います。この方式をハイブリッド暗号と呼びます。
1. ハイブリッド暗号の基本フロー#
ランダムなデータ鍵を生成
↓
データ本体をAEADで暗号化
↓
受信者の公開鍵でデータ鍵を暗号化
↓
暗号文、nonce、認証タグ、暗号化されたデータ鍵を送信
↓
受信者が秘密鍵でデータ鍵を復号
↓
データ鍵で暗号文を復号し、認証タグを検証具体的には、次のように動きます。
- 暗号論的に安全な乱数から、AES-GCMやChaCha20-Poly1305用のデータ鍵を生成する。
- データ本体を共通鍵暗号で暗号化する。AEADなら、改ざん検出用の認証タグも生成される。
- 受信者の公開鍵でデータ鍵を暗号化する。RSAを使う場合は、通常RSA-OAEPを利用する。
- 暗号文、nonce、認証タグ、暗号化されたデータ鍵、アルゴリズム情報を一緒に保存または送信する。
- 受信者は自分の秘密鍵でデータ鍵を復号し、その鍵でデータ本体を復号する。
- 認証タグを検証し、検証に失敗したらデータを破棄する。
2. 共通鍵暗号と公開鍵暗号の役割#
| 方式 | 代表例 | 主な役割 | 特徴 |
|---|---|---|---|
| 共通鍵暗号 | AES-GCM、ChaCha20-Poly1305 | 大量データの暗号化 | 高速。暗号化と認証を同時に行える |
| 公開鍵暗号 | RSA-OAEP、X25519 | データ鍵の保護と交換 | 鍵交換は便利だが、大きなデータには遅い |
| デジタル署名 | RSA-PSS、Ed25519 | 送信元と完全性の検証 | 暗号化とは目的が異なる |
「暗号化」は機密性を守り、「署名」は完全性と送信元を検証します。署名しただけでは内容は秘匿されません。
3. なぜファイルを分割するのか#
大容量ファイルを一度にメモリへ読み込めない場合は、一定サイズのチャンクへ分割して暗号化します。
- チャンクごとにnonceを安全に管理する。
- チャンクの順序や長さを認証対象に含める。
- 各チャンクの認証タグを検証してから復号データを利用する。
- 中断後に再開できるよう、メタデータを設計する。
これは「RSAでファイルを小さなブロックへ分けて暗号化する」という意味ではありません。通常は共通鍵暗号でチャンクを処理し、公開鍵暗号はデータ鍵に一度だけ使います。
4. エンドツーエンド暗号化#
エンドツーエンド暗号化(E2EE)では、送信側でデータを暗号化し、受信側だけが復号できるようにします。サーバーは暗号文を保存・転送できますが、復号鍵を持たない設計にします。
- クライアントがデータを暗号化する。
- データ鍵を受信者の公開鍵で保護する。
- サーバーには暗号文だけを保存する。
- 受信者が秘密鍵でデータ鍵を復号する。
実際のE2EEでは、鍵の失効、端末の追加、バックアップ、メタデータ、本人確認、リプレイ攻撃なども考慮する必要があります。
5. 既存ツールを使う#
大容量ファイルを扱うときは、実績のあるツールを使う方が安全です。
- GnuPG(GPG):OpenPGPの仕様に基づき、共通鍵暗号と公開鍵暗号を組み合わせてファイルを暗号化できる。
- age:ファイル暗号化に特化した比較的シンプルなツール。
- TLS:ネットワーク転送中のデータを保護する。保存データの暗号化とは目的が異なる。
- クラウドのKMS:暗号鍵の生成、保管、ローテーション、アクセス制御を管理する。
6. ハードウェアとクラウド#
AES-NIなどのCPU命令は、AESの処理を高速化します。HSM(Hardware Security Module)は、秘密鍵を専用デバイス内で生成・保管し、外部へ取り出しにくくします。
クラウドストレージでは、AES-256などによる保存時暗号化が標準で提供される場合があります。しかし、クラウド事業者管理鍵と利用者管理鍵では、権限モデルや復旧手順が異なります。データの機密性要件に応じてKMSとアクセス制御を設計してください。
まとめ#
- 大容量データは、AES-GCMやChaCha20-Poly1305などのAEADで暗号化する。
- 公開鍵暗号は、データ本体ではなくデータ鍵を保護する。
- 大容量ファイルはチャンクへ分けても、公開鍵暗号で各チャンクを暗号化する必要はない。
- 暗号化とデジタル署名は目的が異なる。
- 実運用では、実績のあるツール、鍵管理、nonceの一意性、認証タグの検証を重視する。



