今回は画像に隠しメッセージを仕込める技術
ステガノグラフィーのご紹介です。
解説動画はこちら
ステガノグラフィーとは
これにより、情報を目に見えない形で
秘匿することができます。
1 のビットを反転すると、全てのビットが反転し
...11111110 というビット列になる
音声ファイルや動画ファイルにも同様の手法が使われ
元画像はこんな感じです。
画像にメッセージを埋め込むコードサンプル
実行するとメッセージを埋め込んだ画像が生成されます。
元の画像と比較すると
差分はほとんどわからないですね!!
画像からメッセージを取り出すコードサンプル
メッセージが復元されました。
最後に
こちらの画像にはメッセージを埋め込んでいるので
ダウンロードして解読してみてくださいね
今回はステガノグラフィーをご紹介しました
画像などに隠しメッセージを残せるので
暗号のように秘匿したいやりとりで
使うこともできたりして
なかなか面白い技術です。
いろいろ遊んでみてみてくださいね
それでは
ステガノグラフィーのご紹介です。
解説動画はこちら
ステガノグラフィーとは
ステガノグラフィー(Steganography)
画像、音声、動画などのデジタルデータに
別の情報を隠す技術のことです
別の情報を隠す技術のことです
これにより、情報を目に見えない形で
秘匿することができます。
早速情報を仕込んだ画像を作成してみましょう
ステガノグラフィーの仕組み
ステガノグラフィーの仕組み
画像への埋め込み
最下位ビット(LSB)を利用して
画像の色をわずかに変更しメッセージを隠します。
画像の色をわずかに変更しメッセージを隠します。
最下位ビット(Least Significant Bit):
二進数の右端に位置する値
二進数の右端に位置する値
バイナリ変換:
メッセージをバイナリ形式に変換し終了ビットを追加
メッセージをバイナリ形式に変換し終了ビットを追加
ピクセルの変更:
各ピクセルのRGB成分の最下位ビットを変更して
メッセージを埋め込み
各ピクセルのRGB成分の最下位ビットを変更して
メッセージを埋め込み
ビット演算
変更対象のRGB値の各成分は0から255の範囲の整数
~1 は、ビット反転演算子
1 のビットを反転すると、全てのビットが反転し
...11111110 というビット列になる
RGB値 が 5の場合(バイナリで 00000101)
~1 は ...11111110 となり
5 & ~1 は 00000101 & 11111110 となり
結果は 00000100(つまり 4)になる
結果は 00000100(つまり 4)になる
00000101 &
11111110
↓
00000100
ピクセルの変更
各ピクセルのRGB成分から最下位ビットを取得し
バイナリメッセージの値に変更します
メッセージの復元
バイナリメッセージを8ビットごとに分割し、文字に変換
終了ビット(11111111)が見つかるまでメッセージを復元する
音声ファイルや動画ファイルにも同様の手法が使われ
音声の波形や動画のフレームに情報を埋め込むことが可能です。
埋め込む画像
元画像はこんな感じです。
画像にメッセージを埋め込むコードサンプル
from PIL import Image def encode_image(image_path, secret_message, output_path): # 画像を開く image = Image.open(image_path) encoded_image = image.copy() # メッセージをバイナリに変換 binary_message = ''.join(format(ord(char), '08b') for char in secret_message) + '11111111' # 終了ビット data_index = 0 # 画像のピクセルを走査 for y in range(encoded_image.height): for x in range(encoded_image.width): pixel = list(encoded_image.getpixel((x, y))) for i in range(3): # RGBの各成分 if data_index < len(binary_message): pixel[i] = (pixel[i] & ~1) | int(binary_message[data_index]) # 最下位ビットを変更 data_index += 1 encoded_image.putpixel((x, y), tuple(pixel)) if data_index >= len(binary_message): break if data_index >= len(binary_message): break encoded_image.save(output_path) # 使用例 input_img_path = "画像のパス" input_message = "埋め込むメッセージ" output_img_path = "出力後のパス" encode_image(input_img_path, input_message, output_img_path)
実行するとメッセージを埋め込んだ画像が生成されます。
元の画像と比較すると
差分はほとんどわからないですね!!
画像からメッセージを取り出すコードサンプル
from PIL import Image
# バイナリメッセージを8ビットごとに分割して文字に変換
def make_message(binary_message):
message = ''
for i in range(0, len(binary_message), 8):
byte = binary_message[i:i+8]
if byte == '11111111': # 終了ビットを検出
break
message += chr(int(byte, 2))
return message
def decode_image(image_path):
image = Image.open(image_path)
binary_message = ''
# 画像のピクセルを走査
for y in range(image.height):
for x in range(image.width):
pixel = image.getpixel((x, y))
for i in range(3): # RGBの各成分
binary_message += str(pixel[i] & 1) # 最下位ビットを取得
return make_message(binary_message)
# 使用例
decoded_message = decode_image('output_image.png')
print("Decoded message:", decoded_message)
Decoded message: Hello Otupyメッセージが復元されました。
最後に
こちらの画像にはメッセージを埋め込んでいるので
ダウンロードして解読してみてくださいね
今回はステガノグラフィーをご紹介しました
画像などに隠しメッセージを残せるので
暗号のように秘匿したいやりとりで
使うこともできたりして
なかなか面白い技術です。
いろいろ遊んでみてみてくださいね
それでは
コメントする