画像および音声オブジェクトの内部に情報を隠す4つの方法
ステガノグラフィでは、普通のテキストファイルの情報が画像または音声のファイルに埋め込まれる。情報が埋め込まれたファイルは、見聞きする分には元の画像または音声ファイルと同じだが、ファイルサイズだけがわずかに変化する。セキュリティの度合いをさらに高めるために、埋め込む前のテキストファイルを暗号化しておくことも可能だ。
本稿では、機密情報をオブジェクトの内部に隠したりそこから取り出したりするための便利なツールをいくつか紹介する。こうしたプログラムやツールのほとんどは、各種Linuxディストリビューションのパッケージリポジトリから入手できる。
OutGuess
OutGuessは、画像オブジェクトの内部に情報を隠すことができるコンソールベースの一般的なステガノグラフィ・ツールだ。最新のバージョン0.2は、2001年後半にリリースされたもので、PPM、PNM、JPEGの各画像フォーマットへの埋め込みに対応している。OutGuessは、Linux、*BSD、Solaris、AIX、HP-UX、Mac OS X、Windowsで利用できる。
ここでは、プロダクションサーバのrootパスワードを安全な形で同僚に送信することを考える。最初にこのパスワードをpass.txtというファイルに記入してから、そのファイルを秘密鍵(”summer” ― 誰にも口外しないこと)で暗号化し、暗号化されたファイルをgrill.jpgという画像ファイルに埋め込む。OutGuessでは、こうした操作が次のコマンド1つで実行できる。
~$ outguess -k summer -d pass.txt grill.jpg summer-grill.jpg
秘密鍵による機密データの暗号化が不要なら、-k
オプションは外して構わない。ただし、このオプションを外してしまうと、この画像にファイルが埋め込まれていることを知っている者なら誰でもその出力ファイルを抽出できることになる。
上記コマンドにより、サーバのrootパスワードが埋め込まれたsummer-grill.jpgという画像ファイルができるので、あとはこのファイルをメールで同僚に送ればよい。この画像を見たところで誰もおかしな点に気付くことはないだろう。画像オブジェクトに埋め込まれたデータは人間の目には見えないからだ。
この画像ファイルを受け取った同僚は、そこからパスワードの情報を取り出す必要がある。暗号化に使われた秘密鍵を知っていれば、彼は次のコマンドを実行することができる。
~$ outguess -k summer -r summer-grill.jpg pass.txt
ここで-k
オプションと秘密鍵を指定しない場合は、OutGuessによってpass.txtファイルが抽出されるもののそのファイルを読むことはできない。
Steghide
Steghideというプログラムを使っても、画像および音声ファイルの内部に機密データを隠すことができる。Steghideの最新バージョン0.51は2003年10月にリリースされたもので、機密情報を内部に隠せるファイルとしてはBMPとJPEGの各画像フォーマットとAUとWAVの各音声フォーマットに対応している。デフォルトの暗号化アルゴリズムは、AES(Advanced Encryption Standard)と基本的に同じRijndael(鍵長は128ビット)だが、その他多くの暗号化アルゴリズムを選ぶこともできる。Steghideは、LinuxとWindowsのどちらの環境でも動作する。
先ほどと同じ状況を想定してSteghideの使い方を見てみよう。pass.txtファイルを暗号化して挿入する際のSteghideのコマンドは次のようになる。
~$ steghide embed -cf grill.jpg -sf summer-grill.jpg -ef pass.txt -p summer
このpass.txtを画像ファイルsummer-grill.jpgから抽出するには、次のSteghideコマンドを実行する。
~$ steghide extract -sf summer-grill.jpg
すると、パスワードの入力を求められる。正しいパスワード(秘密鍵)を与えたときに限り、Steghideによってpass.txtファイルが抽出されるわけだ。なお、抽出時に出力ファイル名を指定しなかったことに注意してほしい。これは、Steghideが自動的に、挿入されたファイル名を把握して同じ名前でそのファイルの抽出を行うためだ。
Stegtools
Stegtoolsは、隠蔽情報のそれぞれ読み取りと書き込みを行うための一対のコマンドラインツールである。最新のバージョンは2005年半ばにリリースされた0.4bで、このソフトウェアは24bppのビットマップ画像に対応し、LinuxおよびFreeBSDの各オペレーティングシステムで動作する。
ここでも、先ほどと同じ状況を想定してコマンドの使い方を見てみよう。
cat pass.txt | /usr/local/stegotools-0.4b/stegwrite grill.jpg summer-grill.jpg 1
上記のコマンドでは、標準入力(catコマンドの出力)をstegwriteツールにリダイレクトし、既存および情報挿入後の各画像ファイルの名前を指定している。なお、stegwriteツールをフルパスで指定しているのは、私の環境ではそこにパスが通っていないためだ。コマンドの末尾の数値は、画像ファイルgrill.jpgに情報を挿入する際に利用される、その画像データの末尾のビット数を表している。この値には1、2、4のいずれかを指定できる。もっと詳しい説明は、StegwriteのREADMEファイルに記されている。
stegreadは、隠蔽情報を画像オブジェクトから読み取り、標準出力に書き出すツールだ。画像ファイルsummer-grill.jpgから例のパスワードを取り出すには、このコマンドを次のように実行すればよい。
~$ /usr/local/stegotools-0.4b/stegread summer-grill.jpg 1 > pass.txt
画像ファイルからパスワード情報をうまく取り出すためには、挿入時の末尾ビット数を正しく与える必要がある。その数値が正しくない場合は、空のpass.txtファイルが抽出される。
SteGUI(SteghideのGUI版)
SteGUIは、SteghideのためのLinuxベースのグラフィカル・フロントエンドとして2006年5月にリリースされた。SteGUIをインストールする前に、stegtools、FLTKツールキット、PStreams、ALSA、Libjpegライブラリをインストールしておく必要がある。
SteGUIのメニューからオブジェクト(画像または音声)を開くと、画面上の選択やクリック操作によって情報の挿入や抽出を行うことができる。ここに用意した写真は、開いたgrill.jpg画像にpass.txtファイルを埋め込もうとしているところだ。その際にどれくらいの暗号化アルゴリズムが利用可能かも、この写真からわかるだろう。すばらしいインタフェースなのだが、SteGUIはSteghideで作成したオブジェクトしか扱うことができない。
まとめ
ステガノグラフィは、個人情報の共有と秘匿に関する多くの手法で活用されている。複数のプラットフォームでステガノグラフィを利用したいという人は、こうしたユーティリティのなかでもOutGuessを選ぶことになるだろう。また、コンソールベースのツールを敬遠する人には、SteghideとSteGUIの組み合わせが最適と言えよう。