「AES-256 で暗号化」とよく聞きますが、256bit の鍵と言いながら、実際に入力するのはパスワードです。この 2 つの関係と、暗号化したファイルの中に何が入っているかを、短く整理します。
登場するもの
| 名前 | 役割 | 秘密? |
|---|---|---|
| AES | 暗号化の手順。世界中に公開されている | いいえ |
| パスワード | 人が覚えて入力する文字列 | はい(秘密はこれだけ) |
| KDF | パスワードから鍵を作る手順(アプリに入っている) | いいえ |
| 256bit の鍵 | AES が実際に使う値。0/1 が 256 個(32 バイト) | はい。ただし保存しない |
| ソルト・IV・タグ | 暗号文と一緒にファイルに入れる値 | いいえ |
256bit はなぜ安全か
鍵の組み合わせは 2²⁵⁶ 通り、およそ 10⁷⁷ 通りです。世界中のコンピューターで総当たりしても、宇宙の年齢を何回くり返しても終わりません。AES 自体も、25 年以上弱点を探されてきて、実用的な破り方は見つかっていません。
ただし、攻撃する人は鍵を総当たりしません。パスワードの候補を試します。 パスワードが abc123 なら、256bit でもすぐ破られます。実際の強さは、パスワードの強さで決まります。
KDF:パスワードから鍵を作る、わざと重い手順
KDF(Key Derivation Function)は、パスワードとソルトから 256bit の鍵を導き出す手順です。同じパスワードとソルトなら、いつも同じ鍵が出ます。だから鍵はどこにも保存せず、復号のたびに作り直します。
KDF の手順はアプリ(7-Zip など)の中にあり、ファイルには「どの KDF を何回くり返したか」という設定とソルトだけが入っています。手順は公開されているので、攻撃する人も自分のプログラムで同じ計算をして、GPU でパスワードを次々に試せます。
そこでパスワード用の KDF(PBKDF2、scrypt、Argon2 など)は、手順そのものが何十万回もくり返さないと鍵が出ないように作られています。前の結果を使って次を計算するので、近道はありません。
| 鍵の作り方 | GPU 1 枚で 1 秒に試せる数(目安) | 英小文字+数字 8 文字を全部試すと |
|---|---|---|
| SHA-256 を 1 回 | 約 100 億個 | 約 5 分 |
| SHA-256 を約 52 万回(7-Zip の方式) | 約 2 万個 | 約 4〜5 年 |
正しい利用者は 1 回だけ計算するので、0.数秒待つだけです。AES の暗号化・復号そのものはとても速く、重いのはこの鍵を作る部分です。
つまり、同じ「AES-256」と書いてあっても、パスワードで暗号化するときの強さは KDF で変わります。たとえば ZIP の AES-256 の KDF(PBKDF2 を 1,000 回)は 7z 形式より軽く、同じパスワードでも総当たりされやすくなります。ただ、KDF が足す強さはパスワード 1〜3 文字分くらいなので、一番効くのはやはりパスワードの長さです。
AES は 16 バイトずつ:暗号利用モード
AES は、鍵を使って 16 バイトを 16 バイトに変える部品です。1 MB のファイルなら、AES を 6 万回以上使います。その使い方の決まりを「暗号利用モード」(モード)と呼びます。
| モード | 使い方 | ひとこと |
|---|---|---|
| ECB | 16 バイトずつ、ばらばらに AES にかける | 同じ 16 バイトは同じ暗号文になり、模様が透けて見える。使ってはいけない |
| CBC | 1 つ前の暗号文を XOR で混ぜてから AES にかける(最初の 1 個は IV を混ぜる) | 古くからある。16 バイトの倍数にそろえる必要がある |
| CTR | AES で「IV+番号」を暗号化して鍵ストリームを作り、平文に XOR で重ねる | 平文と同じ長さになる |
| GCM | CTR + 認証タグ | 暗号化と改ざんチェックを一度にできる。HTTPS などの今の主流 |
「AES-256-GCM」は、アルゴリズム(AES)・鍵の長さ(256)・モード(GCM)をまとめて書いたものです。7z 形式は AES-256-CBC、ZIP の AES-256 は AES-256-CTR(改ざんチェックに HMAC を付ける)にあたります。
ソルト・IV・タグは何のため
どれも秘密ではないので、暗号文と一緒にファイルに入れておけます。
| 無いと何が起きるか | 守るもの | |
|---|---|---|
| ソルト | 同じパスワードから毎回同じ鍵ができ、「よくあるパスワード → 鍵」の表を先に作られて一気に試される | パスワード → 鍵 |
| IV(nonce) | 同じ鍵で暗号化すると同じ暗号文になり、内容が同じだとばれる。使い回すと平文が漏れることもある | 1 回ごとの暗号化 |
| 認証タグ | 暗号文を書き換えられても気づけない。鍵が無いとタグを作り直せないので、改ざんがわかる | 暗号文の中身 |
パスワードを間違えたときも、タグ(7-Zip では復号後の CRC)が合わないので、すぐにわかります。
ファイルの大きさ
比率ではなく、平文とほぼ同じ大きさ+数十バイトです。GCM などのモードでは暗号文は平文と同じ長さで、ソルト・IV・タグの分だけ増えます。CBC では 16 バイトの倍数にそろえる分(1〜16 バイト)が増えます。テキストにするため Base64 にすると、約 1.33 倍になります。
7-Zip で使うとき
- 7z 形式:いつも AES-256。「ファイル名を暗号化する」もオンにすると、ファイル名の一覧も隠せる
- ZIP 形式:暗号化方式で AES-256 を選ぶ。
ZipCryptoは古くて弱いので使わない。ZIP ではファイル名は隠せない - 7z 形式と ZIP 形式は、同じ AES-256 でも KDF もモードも違うので、たがいに開けない。開けるかどうかはアプリではなく「形式」で決まり、7z 形式なら 7z 形式に対応したソフト(7-Zip 以外にもある)で開ける
結局、パスワードをどこに置くか
暗号化は「大きな秘密(ファイル)」を「小さな秘密(パスワード)」に置き換える技術です。秘密が無くなるわけではありません。
- 自分で使う:パスワード管理ソフトに入れる。大事なものは紙に控えて保管する。忘れたら誰にも復号できない
- 人に渡す:同じメールの別便で送るのは、盗める人には両方盗めるので意味が薄い。別の経路で伝えるか、共有リンクや公開鍵暗号でパスワード自体を渡さない
- アプリの設定ファイル:パスワードを暗号化して書いても、復号用の鍵が同じ場所やソースにあれば意味がない。鍵はサーバーの環境変数などに分けて置き、鍵を持つ人をしぼる。鍵のバックアップも、見られる人を増やさない場所に置く

