画像および音声オブジェクトの内部に情報を隠す4つの方法

 覚えきれないほど多くのパスワードがあるのだが、それらのリストを自分にしかわからないように保管できる場所がなくて困っている人はいないだろうか。rootディレクトリ内にpassword.txtなどというファイルを作成するのはもってのほかだが、パスワード保護されたOpenOffice.orgファイルを作るというのも似たり寄ったりだ。パスワードをメモした紙をどこかに隠すというのもいただけない。隠した場所を忘れたり、他の誰かに見つかって悪用されたりする恐れがあるからだ。こうした方法に代わるものとして、ステガノグラフィの利用を考えてはどうだろう。これは、別のオブジェクト(通常はJPEG画像や音声ファイル)の内部に機密情報を隠すという手法だ。

 ステガノグラフィでは、普通のテキストファイルの情報が画像または音声のファイルに埋め込まれる。情報が埋め込まれたファイルは、見聞きする分には元の画像または音声ファイルと同じだが、ファイルサイズだけがわずかに変化する。セキュリティの度合いをさらに高めるために、埋め込む前のテキストファイルを暗号化しておくことも可能だ。

 本稿では、機密情報をオブジェクトの内部に隠したりそこから取り出したりするための便利なツールをいくつか紹介する。こうしたプログラムやツールのほとんどは、各種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
SteGUI(クリックで拡大)
SteGUI(SteghideのGUI版)

 SteGUIは、SteghideのためのLinuxベースのグラフィカル・フロントエンドとして2006年5月にリリースされた。SteGUIをインストールする前に、stegtools、FLTKツールキット、PStreams、ALSA、Libjpegライブラリをインストールしておく必要がある。

 SteGUIのメニューからオブジェクト(画像または音声)を開くと、画面上の選択やクリック操作によって情報の挿入や抽出を行うことができる。ここに用意した写真は、開いたgrill.jpg画像にpass.txtファイルを埋め込もうとしているところだ。その際にどれくらいの暗号化アルゴリズムが利用可能かも、この写真からわかるだろう。すばらしいインタフェースなのだが、SteGUIはSteghideで作成したオブジェクトしか扱うことができない。

まとめ

 ステガノグラフィは、個人情報の共有と秘匿に関する多くの手法で活用されている。複数のプラットフォームでステガノグラフィを利用したいという人は、こうしたユーティリティのなかでもOutGuessを選ぶことになるだろう。また、コンソールベースのツールを敬遠する人には、SteghideとSteGUIの組み合わせが最適と言えよう。

NewsForge.com 原文