メインコンテンツへスキップ
  1. ノート/
  2. セキュリティと暗号/

大量データ・大容量ファイルを暗号化する一般的な方式

·1909 文字·4 分· loading · loading · · ·
ICE345
著者
ICE345
CS Student | System | Linux | OCaml
ここで紹介するのは設計の考え方です。実運用では、独自の暗号方式を実装せず、検証済みのライブラリとプロトコルを使ってください。RSAで大きなファイルを直接暗号化する方式は、一般的な選択ではありません。

大容量ファイルの暗号化では、通常、**共通鍵暗号(AESやChaCha20)公開鍵暗号(RSAや楕円曲線暗号)**を組み合わせます。共通鍵暗号は大量データを高速に処理し、公開鍵暗号は共通鍵を安全に受け渡すために使います。この方式をハイブリッド暗号と呼びます。

1. ハイブリッド暗号の基本フロー
#

ランダムなデータ鍵を生成
データ本体をAEADで暗号化
受信者の公開鍵でデータ鍵を暗号化
暗号文、nonce、認証タグ、暗号化されたデータ鍵を送信
受信者が秘密鍵でデータ鍵を復号
データ鍵で暗号文を復号し、認証タグを検証

具体的には、次のように動きます。

  1. 暗号論的に安全な乱数から、AES-GCMやChaCha20-Poly1305用のデータ鍵を生成する。
  2. データ本体を共通鍵暗号で暗号化する。AEADなら、改ざん検出用の認証タグも生成される。
  3. 受信者の公開鍵でデータ鍵を暗号化する。RSAを使う場合は、通常RSA-OAEPを利用する。
  4. 暗号文、nonce、認証タグ、暗号化されたデータ鍵、アルゴリズム情報を一緒に保存または送信する。
  5. 受信者は自分の秘密鍵でデータ鍵を復号し、その鍵でデータ本体を復号する。
  6. 認証タグを検証し、検証に失敗したらデータを破棄する。

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の一意性、認証タグの検証を重視する。

関連記事


评论