さえぴ の めも

色んなアウトプットする。

Python3でステガノグラフィーを作ってみた

CTFなどでよくでてくるステガノグラフィー。
データを別のデータに隠蔽する暗号的な技術のことです。


今回作るのは、RGB画像に白黒2値の画像を埋め込むタイプのステガノグラフィーです。CTFでよく画像が隠れているあれです。

RGBの各色情報(0〜255の8bit)に対して、どれか一色の下位nbitを操作することで、情報を埋め込みます。
基本的に#nnnnnnとある色情報のうち、下位bitに情報を隠すため、肉眼での確認はほぼ不可能です。

とてもわかりやすい解説:ステガノグラフィーの解析について

自分でも作ってみたいので、スクリプトを書きました。




例として、写真に2値画像を埋め込んでみたいと思います。

f:id:saemero:20180604113604p:plain

この前食べたつけ麺。メッッッッチャ美味しかった。


f:id:saemero:20180604113614p:plain

という思いを込めたFLAG画像を、つけ麺画像に埋め込みます。

つけ麺はRGBだとなんとなく赤っぽいので、Rの下位1bitを利用して埋め込むことにしました。

from PIL import Image

im = Image.open("tsukemen.png")
image = im.convert("RGB")
fl = Image.open("flag.png")
flag = fl.convert("RGB")


for x in range(600):
    for y in range(450):
        r,g,b = image.getpixel((x, y))
        r = r&0B11111110 | int(flag.getpixel((x, y))[0] > 128)<<1

        image.putpixel((x, y), (r,g,b))

image.save("steg.png")

できた画像です。

f:id:saemero:20180604115209p:plain

やっぱめっちゃ美味しそう。

見た目的には一切変わった感じがしませんが、うさみみハリケーン同梱の青い空を見上げればいつもそこに白い猫で確認してみます。


f:id:saemero:20180604115508p:plain

画像を参照して「ステガノグラフィー解析」を選択。
今回はR下位1bitを操作したので、「赤色 ビット1抽出」を選択します。

f:id:saemero:20180604115505p:plain

でてきた!
といった感じで、PILでちょちょっとやることでステガノグラフィー画像を作ることができました。