【ステガノグラフィ入門】#3 スパイ映画だけの話じゃない!画像にメッセージを忍ばせる驚きの技術とは?~LSB法~

ステガノグラフィ

 ステガノグラフィとは、データを他のデータの中に隠蔽し、その存在自体を第三者から秘匿するための技術である。暗号がメッセージの内容を読めなくすることを目指すのに対し、ステガノグラフィはメッセージの存在そのものを隠す点に特徴がある。その最も古典的かつ基本的な手法の一つが、LSB法(Least Significant Bit method)である。

LSB法は、デジタルデータが「0」と「1」のビット列で構成されていることに着目した技術である。データの中で最も影響の小さいビット、すなわち「最下位ビット(LSB)」を、秘密情報で置き換えることで情報を埋め込む。例えば、8ビットで数値を表現する場合、最上位ビット(MSB: Most Significant Bit)が1変わると値は128も変動するが、最下位ビット(LSB)が1変わっても値の変動は1に過ぎない。この微小な変化を利用するのがLSB法の本質である。

最下位ビット LSB(Least Significant Bit)

最下位ビットとは、2進数のデータのうち最も低い桁のビットのことである。
例えば、10進数で”80″を2進数にすれば、初めが一番高い位であるとすると(1100100)となる。この時の最下位ビットは一番右の0ということになる。

最下位ビットに情報を埋め込むとすると、埋め込みたい情報が1なら 1100101 (最下位ビットだけ置き換え)となり、100から 101に変化する。

LSB法

LSB法は特にデジタル画像との親和性が高い。#1~画像のデータ~の記事で紹介した通り、フルカラーのデジタル画像は、光の三原色である赤(Red)、緑(Green)、青(Blue)の組み合わせで一つのピクセル(画素)の色を表現している。一般的に、各色は8ビット、すなわち0から255までの256段階の明るさで表される。

参考記事

【ステガノグラフィ入門】#1 スパイ映画だけの話じゃない!画像にメッセージを忍ばせる驚きの技術とは?~画像のデータ~

「ステガノグラフィ」は画像に情報を隠す技術です。当シリーズ第1回では、その基礎となる画像データが「ピクセル」や「RGB」の2進数でどう構成されているのか、その仕組みを初心者にも分かりやすく図解します。

例えば、あるピクセルの色が (R, G, B) = (110, 50, 200) であったとする。これらの値を2進数で表現すると以下のようになる。

  • R = 110 → 01101110
  • G = 50 → 00110010
  • B = 200 → 11001000

ここに、秘密の情報「101」を埋め込むことを考える。まず、各色の最下位ビット(一番右のビット)を、埋め込みたい情報で置き換える。

  • R: 0110111001101111 (111)
  • G: 0011001000110010 (50)
  • B: 1100100011001001 (201)

この操作により、ピクセルの色は (111, 50, 201) へと変化した。しかし、各色の変化量は256段階のうちのわずか1段階に過ぎない。このような微細な色の変化を人間の視覚で識別することは極めて困難である。そのため、LSB法を用いて情報を埋め込んだ画像は、元の画像と見た目上の区別がほとんどつかない。

実際に 上記画素値の操作をした色の違いを見てもらいたい。

LSB データ埋め込み例

左の色が元の色で元の色に 101を各RGBの最下位ビットに埋め込んだものが右の色である。

埋め込まれていることを知っていてよく見れば、わからなくはないと思いますが、このように二つ並べて表示しても、ぱっと見では埋め込まれているかどうか判断することは困難であることがわかると思います。

また、実際の画像は、このような単色ではなく、画像サイズも大きいのでディスプレイ上での表示は基本的に縮小されて表示されているため、周辺の画素と平均化されて表示されるため、埋め込んだかどうかを判断することはもっと困難になります。

LSB法を試してみる

つぎの画像に”HelloWorld”という文字列を埋め込んでみようと思います。

(文字コードはutf-8とします)

ステップ1 データをビット情報へ

二進数かまず、埋め込みたいデータ(今回は”HelloWorld”という文字列)を2進数のデータに変換します。

(変換例 : UTF-8なら H → 48 (十六進数) → 01001000 (二進数))

一番初めから順番に並べれば、

HelloWorldという文字列は、”0100 1000 0110 0101 0110 1100 0110 1100 0110 1111 0101 0111 0110 1111 0111 0010 0110 1100 0110 0100″という二進数の情報になります。

(見やすさのため4桁ごとにスペースを入れています。)

ステップ2 デミリタを付与

 デミリタとは、データの始まりや終わりを定義する特定のパターンのことです。

デミリタとは

身近なデミリタの例として、アニメのオープニングやエンディング、cmに切り替わるときのアイキャッチがあります。

アニメって、本編が始まる前に必ずオープニングの歌が流れたり、終わるときにエンディングの歌や「つづく!」の文字が出たりしますよね。

  • 普通のセリフやシーンの中に「エンディング曲」が急に流れることはありません。
  • エンディングが流れたら「ここでお話は終わり!」と誰でもすぐにわかるんです。

デミリタも同じで、
「データの中身には出てこない特別な合図(エンディング)」 を置いておくことで、コンピュータが「ここまでがひとかたまり!」と正しく判断できるようにしています。

デミリタの要件として、通常現れないパターンであることが必要なので。今回は16回0が続いたのち16回1が続く ”00000000000000001111111111111111″を使おうと思います。

(実際のデータでは、もしかしたら現れてしまうかもしれないので、実際はそのようなときは1を挿入するなどの対策をしますが、今回は仕組みの紹介なので単純に”00000000000000001111111111111111″がデミリタ以外で出てこないと仮定して実装してみます)

“00000000000000001111111111111111”をもとのデータの最後にくっつけて、

”0100 1000 0110 0101 0110 1100 0110 1100 0110 1111 0101 0111 0110 1111 0111 0010 0110 1100 0110 0100″ + “00000000000000001111111111111111”

”0100 1000 0110 0101 0110 1100 0110 1100 0110 1111 0101 0111 0110 1111 0111 0010 0110 1100 0110 0100 0000 0000 0000 0000 1111 1111 1111 1111″が画像に埋め込むデータとなります。

ステップ3 埋め込む対象の画像を用意

Sailboat.bmp

Lenna.bmp

Earth.bmp

標準画像データベースSIDBA(Standard Image Data-BAse)

一般に画像処理のサンプルとして標準に利用されている画像を用意しました。

標準画像データベースSIDBA(Standard Image Data-BAse)と調べればいろんなところで公開されています。

神奈川工科大学 情報学部 情報工学科信号処理応用研究室

 http://www.ess.ic.kanagawa-it.ac.jp/app_images_j.html から比較的簡単にダウンロードできました。

ステップ4 LSBを置き換えて画像にデータを埋め込み

Sailboat.bmpに埋め込んでみる。Sailboat.bmpの左上の画素値を画素値で読み出すと以下のようになっている。

Sailboat.bmp

左上10pxのの画素値を読み出して表示したもの

左上 (0,0) の画素値は、#6C2F39であり、二進数にすれば、”01101100 00101111 00111001″となる。

この最下位ビットを置き換えればいいので、HelloWorldのデータ(0100 1000 0110….)のはじめの3つを取ってきて、 010がこの画素に埋め込むデータである。

“01101100 00101111 00111001″ → ”01101100 00101111 00111000” (#6C2F38)

同様に次に続く画素に操作をしHelloWorldのデータで置き換えれば、LSB法でのステガノグラフィ完了!!

ステップ5 埋め込んだ画像

実際に操作したものが以下の画像になる。

Sailboat.bmp 埋め込み後

埋め込んだ後の画像左上10pxのの画素値を読み出して表示したもの

左上から順に埋め込んだので、画素値を確認すれば一番上の行の画素が変化していますね。しかし、画像の見た目上は埋め込まれていることがわからないというのがわかるはずです。

ステップ6 埋め込んだ画像からデコード

埋め込めたデータが読み取れないと意味がないので、読み取れるか確認します。デコードの仕方は、左上から埋め込んだので、左上から順に画像の画素を読み出してその最下位ビットを確認してデータを取り出し、それを同じ文字コードで読み直せば、元のデータを取り出せます。

デコードした HelloWorld

羅生門くらいの文量(6112文字)なら 256*256のサイズでも埋め込み可能です。

LSB法 まとめ

LSB法では、見た目にほとんど影響を与えない最下位ビットを隠したいデータで置き換えることで、画像としてはほとんど見た目を変えずにデータを隠すことができることが分かった。

この方法は単純に埋め込むことができる一方、簡単に解読されたり、画像データが破損したり、圧縮処理で簡単にデータが消失し、読み出せなくなってしまうという特性があります。非可逆圧縮を行う .jpg形式だとデータが消え、可逆圧縮の.pngや.bmpのような圧縮を行わない形式ではデータが消えません。

次の記事では、今回のLSB法を用いて画像にデータを埋め込むソフトを作ったので、身近な写真(.PNG)に実際に文章を隠してみてもらおうと思います。

では、次の記事で。 lumenHero