これにより、平文には必ずパディング文字が含まれる仕様となるため、復号時に「本来のデータかパディング文字かわからない」という問題を避けることができる。#7パディングを使ったAESのCBCモードに対して攻撃を行ってみる。Attackについて話す。Attackとは、暗号アプリケーションが文字列を復号できるかどうか(復号時のパディング情報が合っているか)の情報を返す場合、攻撃者がこの復号成否情報を用いて平文の特定や暗号文の改ざんができてしまう攻撃である。某RDBではなく、攻撃者の手がかりとなるような情報を与えてしまうブラックボックスなサービスのことを指す。Oracleのある認証アプリケーションを書いてみる。CBCで復号化し、Base64デコードしたユーザIDがadminなら認証が成功するというものにする。クライアントは暗号/復号鍵を知ることはできないし平文の内容も知らない。IV)のみという前提を置く。"__main__":main()socatにて簡易サーバを作成。server.py",stderr別ターミナルから、試しにncコマンドで繋いでみる。与えられたサンプル暗号文を入力するとサーバサイドで復号が走るが、adminではないため認証に弾かれている。padding."とエラーが返ってくる。Decrypt後のパディングチェックにてコケていることがエラーメッセージから判別できる。逆に、最初のブロックを1バイト変えてみるとパディングチェックは成功するはずなので、そのパターンも試してみる。$末尾のブロックは綺麗に復号化されているためパディングチェックは通過したようだが、その後の処理でErrorが発生している。メッセージ内容からして、Base64デコード処理でしくっているように見える。このように、認証成否情報に加えパディングチェック成否の手がかりを確認することができた。以上より、このアプリケーションにはパディングオラクルがあると言える。Attackで解読した暗号文を改ざんしてアプリケーションの認証をバイパスするの2本を想定する。Attackこれはいろんなところで紹介もされているし有名だと思う。矢印を逆にしただけ)。#7パディング文字列が存在しなければならない。求めるときの式はと定義できる。いうのは復号化関数を通ったあとの値。図3右側の赤い領域を示す。値を変えてみながら、正しいパディングとなる入力パターンを確かめることはできないだろうか。変わるため、この時の式は、と表せる。これを1の式に代入すると、となる。求めることができそうだ。Oracleに対して送信する。最終バイトが"01"となりパディング成功を示すメッセージを得られるはずだ(おそらく復号後のサーバ処理でのエラーメッセージだろう)。最終バイトを表すことがわかる。最後から2バイト目を求める。最終バイトは"0202"となる必要があるので、先ほど送信した最終バイトも"01"から"02"になるように調整する。XORしてやれば良い。Attackによる2バイト目の特定3byte目も同様に調整。特定していくことができる。式により最後の平文ブロックを復元することができる。まで計算が可能である)。実際にスクリプトを書いてみる。パディングされた平文を取得することができた。guest'>>>ちなみに、ここからIVを計算することも可能である。わかっているため、これをXORしてやれば良い。そもそも今回はサーバ接続時に手に入っているので計算するまでもないが。次にこの手に入れた平文を使い暗号文の改ざんをして認証をバイパスしてみる。Attack手に入れたユーザIDを"admin"に変え、Base64エンコードをし直してpaddingを加えたものを平文とする。