AES-256暗号化ガイド:軍事レベルのファイル保護
AES-256暗号化とは何か、なぜファイル保護のゴールドスタンダードなのか。この軍事レベル暗号がファイル転送を守る仕組み。
AES-256 は、米国 NSA が CNSSP-15 のもと TOP SECRET データに承認した対称ブロック暗号です。128ビットのブロックを256ビットの鍵で、置換・並べ替え・混合の14ラウンドにわたって暗号化します。AES-256 の鍵を総当たりで解読するには平均 2^255 回の操作が必要です。これは地球上のすべてのコンピューターが宇宙の寿命分動かし続けても到達できない数です。だからこそ SwissTransfer から Tresorit まで、あらゆる真剣なファイル転送サービスが AES-256 を一括暗号として採用しています。その仕組みを解説します。
「256」の意味
AES には128・192・256ビットの3種類の鍵サイズがあります。この数字は鍵の長さだけを示しており、ブロックサイズ(常に128ビット)ではありません。鍵サイズによって実行されるラウンド数が決まり、AES-128では10ラウンド、AES-192では12ラウンド、AES-256では14ラウンドです。
ラウンド数が多いほど拡散性が高まります。各出力ビットがより多くの入力ビットに依存するようになり、2011年に発表されたバイクリーク攻撃のような暗号解析攻撃への耐性が向上します。バイクリーク攻撃は AES-256 の有効セキュリティを理論上256から254.4ビットに引き下げましたが、それでも実用的な攻撃から大きくかけ離れた水準です。
AES の仕様は FIPS 197 で定義され、動作モードは NIST SP 800-38A から 800-38G で規定されています。
動作モードの選択:GCM vs CBC vs ECB
AES はブロック暗号であるため、1回に128ビットのブロック1つしか暗号化できません。任意サイズのファイルを暗号化するには動作モードが必要です。この選択は極めて重要です。
- ECB(Electronic Codebook):同一の平文ブロックが同一の暗号文を生成します。絶対に使用しないでください。有名な「ECB ペンギン」画像は、ECB 暗号化されたピクセルを通して Tux のシルエットが見える例です。
- CBC(Cipher Block Chaining):各ブロックを直前の暗号文と XOR します。HMAC と組み合わせれば安全ですが、CBC 単独ではパディングオラクル攻撃に脆弱です(2014年の POODLE 攻撃が SSL を直撃しました)。
- GCM(Galois/Counter Mode):カウンターで暗号化しながら、同じパスで128ビットの認証タグを生成します。暗号文を改ざんすると復号が明確に失敗します。現代のサービスはこれを採用しています。
AES-256-GCM は TLS 1.3・Signal・WireGuard・あらゆる信頼できるファイル転送サービスのデフォルトです。サービスがモードを指定せずに「AES-256」と述べている場合は、GCM を前提として確認しましょう。
絶対に再利用してはいけない IV(ナンス)
GCM は同一鍵で暗号化するたびに、固有の96ビット初期化ベクトル(IV)が必要です。同じ鍵で IV を一度でも再利用すると、攻撃者は2つの暗号文を XOR するだけで平文を復元できます。WEP Wi-Fi に対して悪用された壊滅的な失敗として広く知られています。
ベストプラクティスは、暗号学的に安全な乱数生成器(ブラウザなら crypto.getRandomValues()、Linux なら /dev/urandom)で IV を生成し、暗号文の先頭に付加することです。96ビットのランダム IV は、2^32 ファイルを暗号化した時点での衝突確率が約 2^-48 であり、ファイル転送サービスとして許容できる水準です。
鍵導出:パスワードを鍵に変換する
ユーザーは mydog2024 のようなパスワードを使いたがります。AES は256ビットの均一なランダムデータを必要とします。この橋渡しをするのが鍵導出関数(KDF)です。広く使われているのは3つです。
- PBKDF2(HMAC-SHA-256、60万回のイテレーション、OWASP 2023推奨):幅広くサポートされ、Web Crypto API で使用可能。
- scrypt:メモリハードネスを追加して GPU 攻撃コストを引き上げます。Bitcoin と LastPass が採用。
- Argon2id:現在のベストプラクティスで、2015年パスワードハッシュコンペティションの優勝者。パラメータ
memory=64 MB, iterations=3, parallelism=4が推奨です。
12文字のランダムパスワードを Argon2id で処理すると、現代の GPU でのブルートフォースに約10億年かかります。password123 のような弱いパスワードは、KDF の種類にかかわらずミリ秒で解読されます。
ブラウザでの AES:Web Crypto API
ブラウザは window.crypto.subtle を通じて AES-256-GCM をネイティブに公開しています。典型的な処理フローは次のとおりです。
const key = await crypto.subtle.generateKey(
{ name: "AES-GCM", length: 256 },
true,
["encrypt", "decrypt"]
);
const iv = crypto.getRandomValues(new Uint8Array(12));
const ciphertext = await crypto.subtle.encrypt(
{ name: "AES-GCM", iv },
key,
fileBytes
);
現代の CPU には AES-NI 命令が搭載されており、AES-256-GCM をコアあたり約3〜5 GB/s で処理できます。1 GB のファイルは中程度のラップトップで1秒未満で暗号化されます。モバイル端末でも Apple A シリーズや Qualcomm Snapdragon チップが ARMv8 暗号拡張機能を持ち、同等のスループットを実現します。
AES-256 が保護するものとしないもの
AES-256 が解決する問題は一つです。鍵が秘密に保たれている場合の、保存時または転送時データの機密性です。解決しないことは以下のとおりです。
- 鍵管理:パスワードをファイルと一緒にメールで送信すれば、AES-256 は無意味になります。
- エンドポイントの侵害:暗号化前の平文を読み取るマルウェアは暗号を完全に回避します。
- 実装バグ:2018年の BEAST・CRIME・Lucky13 攻撃はいずれも AES 自体ではなく TLS 実装を標的としていました。
- サイドチャネル攻撃:キャッシュタイミングや電力解析で制約のあるデバイスから AES 鍵が抽出された事例があります。デスクトップでは AES-NI がこれをほぼ軽減します。
また AES-256 は送信者の証明はできません。そのためには Ed25519 または ECDSA によるデジタル署名と組み合わせる必要があります。
「軍事レベル」がほぼマーケティングである理由
このフレーズが広まったのは、NSA CNSSP-15 が2003年に TOP SECRET データ用に AES-256 を承認したためです。これは事実ですが、今からすると23年前の話です。AES-128 も SECRET 向けに承認されており、ほとんどの民間ユースケースでは同等の機能を果たします。128から256へのジャンプは、量子コンピューティングの将来の進歩に備えたヘッジです。Grover アルゴリズムは理論上、対称鍵のセキュリティを半減させます。AES-256 の実効強度は128ビットになりますが、それでも安全な水準です。
実際には、AES-NI 使用時の AES-256 は AES-128 より CPU コストが約40%高いですが、普遍的にサポートされているため、128で十分な場合でもデフォルト選択になっています。
サービスが実際に AES-256-GCM を使っているか確認する方法
確認方法は3つあります。
- セキュリティホワイトペーパーを読む。信頼できるサービス(Tresorit・Proton Drive・SwissTransfer・HexaTransfer)は正確なモードと IV の扱いを公開しています。
- クライアントコードを検査する。DevTools を開き、JavaScript バンドル内で
AES-GCMまたはaes-256-gcmを検索してください。明示的に記述されているはずです。 - サードパーティ監査を確認する。Cure53・NCC Group・Trail of Bits は、レビューしたアルゴリズムを明記した監査レポートを公開しています。
注意すべき点:モードを指定しない「銀行レベルの暗号化」、あらゆる「独自アルゴリズム」、または AES-128-ECB への言及はいずれも警戒のサインです。
hexatransfer.comでお試しください — 無料、登録不要、最大10GB。
エンドツーエンド暗号化で大容量ファイルを安全に送信
エンドツーエンド暗号化で最大10GBのファイルを無料で転送。アカウント不要。ファイルはアップロード前にブラウザで暗号化されるため、他の誰にも読まれません。
ファイルを送信