セキュリティ / 認証

AES-256 の「256bit の鍵」と「パスワード」は別物:KDF・ソルト・IV・タグまで一気に整理

「AES-256 で暗号化」とよく聞きますが、256bit の鍵と言いながら、実際に入力するのはパスワードです。この 2 つの関係と、暗号化したファイルの中に何が入っているかを、短く整理します。

登場するもの

名前役割秘密?
AES暗号化の手順。世界中に公開されているいいえ
パスワード人が覚えて入力する文字列はい(秘密はこれだけ)
KDFパスワードから鍵を作る手順(アプリに入っている)いいえ
256bit の鍵AES が実際に使う値。0/1 が 256 個(32 バイト)はい。ただし保存しない
ソルト・IV・タグ暗号文と一緒にファイルに入れる値いいえ
パスワード(秘密) ソルト(乱数) KDF わざと重い計算 256bit の鍵 AES 暗号化したファイルの中身 KDF の設定 ソルト 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 万回以上使います。その使い方の決まりを「暗号利用モード」(モード)と呼びます。

モード使い方ひとこと
ECB16 バイトずつ、ばらばらに AES にかける同じ 16 バイトは同じ暗号文になり、模様が透けて見える。使ってはいけない
CBC1 つ前の暗号文を XOR で混ぜてから AES にかける(最初の 1 個は IV を混ぜる)古くからある。16 バイトの倍数にそろえる必要がある
CTRAES で「IV+番号」を暗号化して鍵ストリームを作り、平文に XOR で重ねる平文と同じ長さになる
GCMCTR + 認証タグ暗号化と改ざんチェックを一度にできる。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 以外にもある)で開ける

結局、パスワードをどこに置くか

暗号化は「大きな秘密(ファイル)」を「小さな秘密(パスワード)」に置き換える技術です。秘密が無くなるわけではありません。

  • 自分で使う:パスワード管理ソフトに入れる。大事なものは紙に控えて保管する。忘れたら誰にも復号できない
  • 人に渡す:同じメールの別便で送るのは、盗める人には両方盗めるので意味が薄い。別の経路で伝えるか、共有リンクや公開鍵暗号でパスワード自体を渡さない
  • アプリの設定ファイル:パスワードを暗号化して書いても、復号用の鍵が同じ場所やソースにあれば意味がない。鍵はサーバーの環境変数などに分けて置き、鍵を持つ人をしぼる。鍵のバックアップも、見られる人を増やさない場所に置く
スポンサーリンク
タイトルとURLをコピーしました