Waveデータに対してLSB置換法に基づくステガノグラフィをPythonでやってみた

はじめに

ステガノグラフィとは、秘密のメッセージを「ばれないように、こっそりと」隠す技術である。画像メディアに対するステガノグラフィPythonパッケージは見つかるのだが、音メディア系はちょっと見当たらなかったので、試しにPythonで書いてみたということ。

今回の実装はステガノグラフィ技術の中でも一番簡単なLSB置換法に基づくものである。LSBとは最下位ビットのことを指す。音の各サンプル点における振幅値(整数)の最下位ビットは相対的に重要度が低いと考えられるので、ここに情報を埋め込む、すなわち振幅値のLSBをメッセージのビットで置き換えるわけである。

準備

1. ステガノグラフィPythonパッケージsteganoをインストール

pip install stegano

2. soundfile, numpy, scipyをインストール

3. メッセージを隠したいwavを用意

Pythonスクリプト

今回は秘密のメッセージを文字列として与えることにした(『Hello, World!』)。以下のコードではwavの入力まわりのつくりがまだ甘いが。隠したメッセージはきちんと復元できるのがポイントである。

$ python stegano_lsb.py
Hidden message is "Hello, World!"

gist.github.com

結果

(サイトからのロードの関係で初回の再生は音の冒頭が欠けて聞こえてしまう…)

  • 元の音

soundcloud.com

  • メッセージが隠された音

soundcloud.com

先頭の数十サンプルに情報を埋め込んでいるので、ぱっと聞いただけでは情報が埋め込まれているかは分からないというわけだ。

今回は先頭部分のサンプルにメッセージ情報を埋め込んだが、ランダムに埋め込む位置を変えるアルゴリズムがsteganoパッケージには実装されているので、今後はそちらのアルゴリズム実装をトライする予定である。