対称暗号 vs 非対称暗号:主な違いを解説
対称暗号と非対称暗号をわかりやすく比較。それぞれの仕組みと現代のファイル転送での組み合わせ方を解説。
対称暗号は暗号化と復号に同一の鍵を使います。ファイル転送を保護する AES-256-GCM がその代表例です。非対称暗号は鍵ペアを使います。誰でも見られる公開鍵と、自分だけが保持する秘密鍵のペアであり、RSA-4096 や Curve25519 などのアルゴリズムで採用されています。対称暗号は高速(現代の CPU では毎秒ギガバイト規模)ですが、両者が同じ秘密を共有する必要があります。非対称暗号は鍵配布の問題を解決しますが、1,000倍ほど低速です。HexaTransfer・Tresorit・Proton Drive・SwissTransfer をはじめとする現代のあらゆるファイル転送サービスは両方を使用しています。非対称で対称鍵を交換し、実際のファイルは対称で暗号化する方式です。
1つの鍵の世界:対称暗号
対称暗号は両方向に同じ鍵を使います。鍵 K でファイルを暗号化した場合、復号にも鍵 K が必要です。現在使われている主要な対称アルゴリズムは以下のとおりです。
- AES(Rijndael):128・192・256ビット鍵、FIPS 197 で標準化。
- ChaCha20:256ビット鍵、AES-NI ハードウェアアクセラレーションがないデバイスで好まれる。
- 3DES:NIST が2023年に廃止。使用しないでください。
スループットが大きな利点です。AES-256-GCM は Intel AES-NI でコアあたり約3〜5 GB/s で動作し、ChaCha20-Poly1305 は ARM スマートフォンで1.5〜3 GB/s に達します。10 GB のファイルを数秒で暗号化できます。
問題は鍵を相手にどう届けるかです。メールで送れば目的が台無しになります。これが鍵配布問題であり、非対称暗号が生まれた理由です。
2つの鍵の世界:非対称暗号
1976年に Diffie と Hellman が発明し、1977年に Rivest・Shamir・Adleman が RSA として実現しました。各ユーザーは数学的に連結した鍵ペアを持ちます。公開鍵は誰でも見られる形で公開され、秘密鍵は本人だけが保持します。公開鍵で暗号化したデータは秘密鍵でのみ復号でき、逆も同様です。
相手に秘密のファイルを送りたい場合は、相手の公開鍵で暗号化します。相手の秘密鍵だけが復号でき、秘密情報を事前に共有する必要はありません。鍵配布の問題が解決します。
現在の非対称アルゴリズムは以下のとおりです。
- RSA-2048 または RSA-4096:低速ですが広くサポートされ、TLS 証明書で使用されます。
- 楕円曲線(ECDH・ECDSA):P-256・P-384・Curve25519 などの曲線上で動作し、鍵が小さく演算が速い。256ビット EC 鍵は3072ビット RSA 鍵と同等のセキュリティです。
- Ed25519:署名の現代的なデフォルト。SSH と Signal で採用。
非対称暗号がファイル暗号化に向かない理由
非対称演算はコストが高くなります。RSA-4096 暗号化は現代の CPU で約100〜500操作/秒で動作します。1回の操作で処理できるのは約470バイト(パディングを差し引いた RSA ブロックサイズ)です。スループットは約200 KB/秒に過ぎず、AES-256-GCM より約5万倍低速です。
RSA で10 GB のファイルを暗号化しようとすると約14時間かかります。AES-256-GCM であれば約3秒です。この速度差が、誰も RSA を直接ファイル暗号化に使わない理由です。
ハイブリッド暗号化:実際のアプローチ
セキュリティと速度の両立が必要なすべてのプロトコルは、両者を組み合わせています。TLS 1.3・PGP・Signal・Age・あらゆる信頼できるファイル転送サービスはこのパターンを採用しています。
- 送信者がランダムな256ビット AES 鍵(「セッション鍵」または「ファイル鍵」)を生成する。
- ファイルをその鍵で AES-256-GCM 暗号化する。
- AES 鍵を受信者の公開鍵(RSA-OAEP または ECIES)で暗号化する。
- 暗号文と暗号化された鍵の両方を受信者に送る。
- 受信者は秘密鍵で AES 鍵を復号し、それでファイルを復号する。
非対称演算のコストは受信者ごとに256ビット鍵のために1回だけ払います。ファイル本体は対称暗号で全速処理されます。両者の長所を兼ね備えた手法です。
ファイル転送サービスごとの違い
ブラウザベースの転送サービスには特有の課題があります。受信者が鍵ペアを持っていない場合があることです。リンクをクリックするだけの受信者への対応として、3つのパターンがあります。
- 共有リンク対称のみ(SwissTransfer・HexaTransfer・Firefox Send の後継):送信者のブラウザでランダムな AES-256 鍵を生成して URL フラグメントに埋め込み、受信者のブラウザがフラグメントから読み取ります。非対称暗号は不要で、フラグメント自体がチャンネルです。
- アカウント間非対称(Tresorit・Proton Drive):各ユーザーが登録時に生成した RSA または ECC 鍵ペアを持ちます。特定の受信者向けのファイルはその公開鍵で暗号化されます。
- パスワード付きハイブリッド(多くのサービス):URL フラグメントにソルトが含まれ、ユーザーがパスワードを入力すると PBKDF2 または Argon2id が対称鍵を導出します。非対称は使わず、パスワードが共有秘密として機能します。
共有リンク方式は最もシンプルでアカウントのない受信者でも使えます。アカウント紐付け非対称は、リンクを失っても鍵が漏れないためより強固です。脅威モデルに応じて選択しましょう。
デジタル署名:非対称のもう一つの役割
非対称暗号は対称暗号ではできないことを実現します。送信者の証明です。秘密鍵でファイルに署名すると、公開鍵を持つ誰でも署名を検証でき、署名後に改ざんされていないことを確認できます。対称暗号でも認証は可能ですが(HMAC・GCM 認証タグ)、それは秘密を共有済みの当事者間に限られます。
使用されている署名アルゴリズムは以下のとおりです。
- RSA-PSS(SHA-256 付き):レガシーですが広くサポートされています。
- ECDSA(P-256 または P-384):NIST 承認、米国連邦システムで使用。
- Ed25519:高速・決定論的・RNG の質に依存しない。現代の標準的な選択肢。
ソフトウェア配布(apt・Homebrew・Docker イメージ)はサプライチェーンの改ざんを防ぐために Ed25519 または RSA 署名を使っています。ファイル転送サービスは通常署名を直接公開しませんが、AES-256-GCM の GCM 認証タグが単一の暗号化内で整合性を保証します。
鍵サイズとセキュリティレベルの対応表
古典的コンピューターに対する同等セキュリティの目安は以下のとおりです。
- 128ビット対称 = 3072ビット RSA = 256ビット EC(P-256 または Curve25519)
- 192ビット対称 = 7680ビット RSA = 384ビット EC(P-384)
- 256ビット対称 = 15360ビット RSA = 512ビット EC(P-521)
NIST の新システムへの推奨は最低112ビットセキュリティ(RSA-2048 または P-256)です。連邦機関は2030年まで最低128ビット(RSA-3072・P-384)を使用します。
将来の量子コンピューターに対して、対称鍵は強度が約半減します(Grover アルゴリズム)。RSA と ECC は完全に破られます(Shor アルゴリズム)。NIST は2024年にポスト量子代替を標準化しました。鍵交換用の ML-KEM(旧称 Kyber)と署名用の ML-DSA(旧称 Dilithium)です。移行は進行中ですが速くはありません。
どちらをいつ使うべきか
実用的な判断基準をまとめます。
- 自分用のファイル暗号化(バックアップ・アーカイブ):Argon2id で派生した強力なパスワードと組み合わせた AES-256-GCM。非対称は不要。
- 既知の受信者1名へのファイル送信:ハイブリッド。ファイルは AES-256-GCM、セッション鍵は公開鍵でラップする。
- 複数の受信者への送信:ファイルを AES で1回暗号化し、各受信者の公開鍵で別々に鍵をラップする。受信者あたり約300バイトの追加に過ぎません。
- 送信者の証明:暗号文への Ed25519 署名。
- リンク経由の一回限りの共有:URL フラグメントに鍵を含む対称暗号。
まとめ:実用的なスタック
機密転送のための現実的な構成は、一括暗号化に AES-256-GCM・受信者に身元がある場合の鍵交換に X25519 ECDH・パスワード導出に PBKDF2 または Argon2id・トランスポートに TLS 1.3 を組み合わせるものです。これが現代の監査済みサービスが実際に展開している構成です。
hexatransfer.comでお試しください — 無料、登録不要、最大10GB。
エンドツーエンド暗号化で大容量ファイルを安全に送信
エンドツーエンド暗号化で最大10GBのファイルを無料で転送。アカウント不要。ファイルはアップロード前にブラウザで暗号化されるため、他の誰にも読まれません。
ファイルを送信