Работа с изображениями Python с использованием PIL (LSB) - PullRequest
2 голосов
/ 02 октября 2019

Я недавно начал изучать стеганографию, и я столкнулся с проблемой, которую просто не понимаю. По сути, изображение представляет собой png, в котором есть скрытый флаг.

Когда вы извлекаете битовые плоскости из изображения, вы видите, что в синей и зеленой плоскостях есть изображение, которое вы видите в красной. Чтобы показать флаг в виде открытого текста, вы должны удалить эти изображения из красного, XORing LSB или что-то. Я не совсем уверен.

Вот так выглядит изображение в красной плоскости, если вы не удалите остальные.

Image of what it does if you don't remove the other images

Мой вопроскак мне делать такие вещи? Это изображение под вопросом.

Here's a link to the image in question

1 Ответ

2 голосов
/ 02 октября 2019

На самом деле скрытое изображение находится в самых низких 3-битных плоскостях. Выполнение полной битовой декомпозиции проясняет это.

Red plane bit decomposition

Начните с загрузки изображения в массив с массивами, который будет иметь размеры MxNx3.

import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

img = Image.open('stego.png')
data = np.array(img)

Все, что вам нужно сделать сейчас, это XOR каждой цветовой плоскости с другой и затем сохранить 3 младших значащих бита (lsb).

extracted = (data[...,0] ^ data[...,1] ^ data[...,2]) & 0x07
plt.imshow(extracted)
plt.show()

extracted message

В случае, если это не было очевидно, часть & 0x07 является операцией AND с двоичным числом 00000111, просто записанным в шестнадцатеричном формате для краткости.

Если вы не сохраните все 3 lsb,тогда вы либо пропустите некоторые буквы в решении, либо все будет там, но некоторые края будут не такими гладкими. Первый из них критически важен.

...