steganographyとは、情報隠ぺいの技術の1つになります。
画像データや、音声データなど様々なデータに情報を埋め込んで隠ぺいすることが可能です。
電子透かしなど良いことに使われる一方で、悪意のあるスクリプトを隠ぺいしたりと悪用されることも多くあります。
今回は、Steghideを利用して、画像に機密データを隠してみようと思います。
steganographyはどうやってデータを隠すのか?
データを隠す方法は、いくつか異なる手法があります。
例えば、LSBとして知られれている最下位ビット手法は、最も使用されているものの一つです。
最下位ビット手法は、バイトの最後の数ビットを変更してメッセージをエンコードする手法です。
画像は、赤、緑、青の値がそれぞれ1バイトで表現されます。
完全な赤は、(11111111,00000000,00000000)[(255,0,0)]ですが、下位2ビットを最大まで変更した場合、(11111100,00000011,00000011)(252,3,3)となります。
これは、データとしては確かに違うものではあるのですが、肉眼で気づくことはほとんど不可能だと思います。
このように肉眼ではほぼ変わらない下位2ビットを利用して、機密情報を隠すことを最下位ビット手法といいます。
最下位ビット手法は、最もわかりやすい手法であることもまた事実ですので、実際はもう少し洗練された手法を利用することになると思います。
隠しデータをファイルに埋め込む
Steghideを使って、画像にテキストファイルを隠していきます。
steghideをインストール
まずは、steghideのインストールからしていきましょう。
今回は、Linuxを想定した手順を記載していきます。
インストール方法は単純で、aptを利用するだけです。
sudo apt-get install steghide
これが実行できれば、インストールは完了です。
画像にファイルを埋め込む
次に、インストールしたsteghideを利用して画像にファイルを埋め込みます。
まずは、埋め込む機密ファイルを作成しておきましょう。
これは、スクリプトでもいいのですが、今回はテキストファイルにしておきます。内容は、お好きに設定してください。
sudo touch secret.txt
vi secret.txt
sudo vi secret.txt
私はこんな感じにしました。画像からファイルを抽出した際に、同じ内容が確認取れたら成功ですね。
cat secret.txt
secret-1234567890-text
次は、機密ファイルを埋め込む画像を用意します。
なんでもいいので、適当に画像を用意してください。私は、実家のワンちゃんの画像を用意しました。(笑)
steghideでファイルを埋め込む場合は、このようなコマンドになります。
steghide embed -ef [機密ファイル] -cf [機密ファイルを埋め込むファイル] -sf [出力ファイル] -z [圧縮レベル] -e [暗号化タイプ]
- -ef
-
隠したいファイルを指定。Pythonスクリプト、shellスクリプトなど様々なファイルを埋め込むことが可能。
- -cf
-
-efで設定したファイルを、埋め込むファイルを指定。
- -sf
-
出力ファイルを指定。省略した場合は、元ファイルが上書きされます。
- -z
-
1~9までの圧縮レベルを指定。圧縮したくない場合は、-Zを使用する。
- -e
-
暗号化タイプを指定。指定なしの場合、AES暗号化を使用します。暗号化しない場合は、-e noneになります。
こんな感じのコマンドで今回は実施してみます。
steghide embed -ef secret.txt -cf inu.png -e none -Z
Enter passphrase: 1234
Re-Enter passphrase: 1234
embedding "secret.txt" in "inu.png"... done
抽出する際のパスワードを求められるので、任意のパスワードを設定しておきます(今回は、1234にしておきました。)
上記のような、メッセージが出たら、フォルダの画像が更新されているはずです。
今回出力されたのが、下記です。元画像が上にありますが、肉眼で見分けはつかないですね。
これで、画像にファイルを埋め込むことに成功しました。
画像からファイルを抽出する
次は、本当に埋め込まれているか確認してみましょう。
抽出するのも非常に簡単です。
画像からファイルを抽出
画像からファイルを抽出するコマンドは、下記になります。
sudo steghide --extract -sf inu.png -xf extractSecret.txt
Enter passphrase:
wrote extracted data to "extractSecret.txt".
パスワードが求められますので、埋め込み時に設定したパスワードを入力してください。
これで、画像からファイルを抽出できていると思います。
中身を確認してみましょう。
無事、同じ文字列が確認できると思います。
sudo cat extractSecret.txt
secret-1234567890-text
まとめ
今回は、steganographyを理解する目的で、Steghideを利用して、画像に機密データを隠してみました。
いずれは、独自の手法を編み出し手見たいなと思っております。