Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで画像に秘密のメッセージを隠す方法|Pillowとstepicで学ぶステガノグラフィ入門

ステガノグラフィ(Steganography)とは、情報を目立たない形で隠す技術です。SHA1やMD5などのアルゴリズムでデータを暗号化することに重点を置く暗号技術(Cryptography)とは異なり、ステガノグラフィは、データ(ファイル、画像、メッセージ、動画など)を別のファイルや画像の中に埋め込み、その存在自体に気づかれないようにすることを目的としています。

この記事では、画像の見た目にほとんど変化を与えることなく、画像の中に情報を隠すシンプルなPythonプログラムを作成します。プログラムは大きく分けて2つの部分から構成されます。1つ目は、画像ファイルから秘密情報を取り出すデコード機能、2つ目は、秘密のメッセージを画像に埋め込むエンコード機能です。

ここではPythonのPillowライブラリを使用します(OpenCVなど他のライブラリでも同様の処理が可能です)。pipを使ってインストールできるので、コマンドプロンプトで次のコマンドを実行してください。

$ pip install pillow

ピクセルとカラーモデルの基本概念

ピクセルは、画像を構成する最小単位の要素です。各ピクセルが元画像の一部を表しており、ピクセル数が多いほど、実際の画像をより精細かつ正確に再現できます。

白黒画像(グレースケールではなく2値画像)の場合、黒いピクセルは「1」、白いピクセルは「0」という値を持ちます。一方、カラー画像には3つの主要な色成分(RGB:赤・緑・青)があり、それぞれ0〜255の値を持ちます。たとえば (255, 255, 255) は白を、(0, 0, 0) は黒を表します。8ビットの2進数で表現できる最大値が255であるため、これが各成分の上限となります。

2進数の基数は2なので、2進数から10進数への変換はとても簡単です。たとえば、2進数「01010101」を10進数(基数10)に変換すると、次のようになります。

26 + 24 + 22 + 20 = 64 + 16 + 4 + 1 = 85

この2進数から10進数への変換は、Pythonのターミナルでも簡単に確認できます。

>>> print(0b01010101)
85
>>> type(0b01010101)
<class 'int'>
>>> 0b01010101
85
>>> 0b01010110
86

実装の流れ

全体の処理は、次のステップで進めていきます。

ステップ1: 必要なライブラリ/パッケージをインポートする
ステップ2: データを隠したいファイルまたは画像を開く
ステップ3: 元画像にテキストをエンコードし、保存する
ステップ4: 元画像と加工後の画像を比較し、見た目に変化がないか確認する
ステップ5: 画像をデコードし、隠されたデータを取り出す

サンプルコード

まず、必要なライブラリをインポートします。

>>> # 必要なライブラリをインポート
>>> from PIL import Image
>>> import stepic

エンコードとデコードにはstepicライブラリを使用しています。stepicもpipでインストールできます。

Pythonで画像に秘密のメッセージを隠す方法|Pillowとstepicで学ぶステガノグラフィ入門

続いて、画像を開き、テキストを埋め込んで保存します。

>>> # データを隠したい画像またはファイルを開く
>>> im = Image.open('TajMahal.png')
>>>
>>> # テキストを画像にエンコードし、別ファイルとして保存する
>>> im1 = stepic.encode(im, b'Hello Python')
>>> im1.save('TajMahal.png', 'PNG')
>>>
>>> # 両方の画像を表示して、見た目に変化がないか確認する
>>> im1 = Image.open('TajMahal.png')
>>> im1.show()

テキストが埋め込まれた画像:

Pythonで画像に秘密のメッセージを隠す方法|Pillowとstepicで学ぶステガノグラフィ入門
元画像の表示:
>>> im.show()
Pythonで画像に秘密のメッセージを隠す方法|Pillowとstepicで学ぶステガノグラフィ入門

一見すると、元の画像と埋め込み後の画像に違いはほとんどありません。最後に、画像をデコードして隠されたデータを取り出してみましょう。

>>> # 画像をデコードして、隠されたデータを抽出する
>>> im2 = Image.open('TajMahal.png')
>>> stegoImage = stepic.decode(im2)
>>> stegoImage
'Hello Python'

このように、Pythonを使えばテキストを画像に隠すのは非常に簡単です。入力には動画など他の形式を使うこともできますし、同じ結果が得られる別のライブラリを利用することも可能です。それでは、Pythonでのステガノグラフィをお楽しみください!

補足:stepicが採用するLSB方式の仕組み

stepicライブラリは「LSB(Least Significant Bit:最下位ビット)」と呼ばれる手法を採用しています。これは、各ピクセルの色成分の最下位ビットを、秘密情報のビットで置き換える方法です。最下位ビットが変化しても色のずれはわずか(最大1/255程度)であるため、人間の目では元の画像との違いをほぼ認識できません。これが、画像の見た目を損なわずにデータを隠せる理由です。

また、ステガノグラフィにはPNGのような可逆圧縮(ロスレス)形式の画像が適しています。JPEGなどの非可逆圧縮形式では、保存時に圧縮処理が行われるため、埋め込んだデータが壊れてしまう可能性がある点に注意しましょう。

  1. Pythonで画像を読み込む方法:OpenCVとPILを使った基本操作を解説

    OpenCVによる画像処理OpenCV(Open Source Computer Vision)は、機械学習とコンピュータビジョンのために開発されたオープンソースのプログラミングライブラリです。コンピュータビジョンアプリケーション開発のための共通基盤を提供し、商用製品への機械学習の導入を迅速化します。OpenCVには、2,500以上の最適化されたアルゴリズムが含まれており、古典的な手法から最先端の手法まで、コンピュータビジョンと機械学習の両分野をカバーしています。これらの豊富なアルゴリズムにより、顔検出・認識、物体识别、動画内の人間の動作の分類、カメラの動きの追跡、複数画像の結合による高解像度

  2. Pythonで作るWebサイトブロッカー ― 業務時間中にSNSへのアクセスを自動遮断する方法

    大手IT企業で働いたことがある方なら、FacebookやYouTube、InstagramといったSNS系のWebサイトが社内からアクセスできないよう制限されていることに気づいた経験があるかもしれません。こうした制限は、サードパーティ製アプリに頼らなくても実現できます。自分専用のオリジナルツールを作れば、好きなWebサイトを自由にブロックできるのです。しかもPythonでWebサイトブロッカーを開発するのは、それほど難しいことではありません。この記事では、指定したWebサイトをブロックするPythonスクリプトの作り方を解説します。前提条件Python 3.x がインストールされていることPy