ステガノグラフィで画像に文章を隠蔽してみた(Python)

rotor-cipher-machine Python

png画像の中に文章を隠蔽する方法を思いついたので、実装してみました。
画像が多少劣化しますが、元の画像と比較しなければわからないはずです。

色の情報に別の意味をもたせる

png画像は赤・青・緑の3色の濃さを、それぞれ0~255の数字で決めています。
なので、この数字を特定の数で割った余りで文字列を判別できるようにします。

今回対応させる文字列は、アルファベットの小文字、数字、空白、ピリオド、?の39種類としました。

仮に、赤色(R)に文字を隠蔽する場合、

R = R // 39 * 39

とすることで、Rの数値を39で割り切れる数にします。
そして、文字に応じて数字を足します。

室井

次の項目で表を使って説明するから、わからなくても続きを読んでね。

極端な色の劣化を防ぐ

上記の方法だと、色の数値が最大で元の画像から39もずれてしまいます。
これでは不自然なので、RGBの3色で1文字を表すことにします。

1ピクセルで1文字を表すので、640 x 360の画像なら230,400文字を埋め込むことができます。

対応表
  • Rを3で割った余り
  • Gを4で割った余り
  • Bを5で割った余り

この3つの数字を上の表と照らし合わせて文字を判別します。
Rの余りが0のときは、飛ばして処理することにしました。

文章の終端は!で表しました。
文章を取り出す際に、Rが2、Gが3、Bが4のピクセルで解析を終了します。

文章を埋め込むコード

埋め込む文章を書いたテキストファイルを6行目に、画像を11行目に指定します。

指定したテキストファイルの中身は下記の文章です。

元画像はいらすとやの画像を使いました。いらすとやの画像このコードを実行すると、result.pngが出力されます。

文章を取り出すコード

上記のコードで出力したファイルを3行目に記述します。

コードを実行すると、文章が表示されます。

出力結果
室井

BASE64エンコードを使えば、大文字、小文字、数字に対応させるだけで日本語対応できそう。