Алгоритм LSB
Автор: Ирина Филимонова • Февраль 2, 2019 • Лабораторная работа • 562 Слов (3 Страниц) • 490 Просмотры
Цель: реализовать алгоритм LSB.
Листинг:
main.py
import LSB
lsb = LSB.LSB()
lsb.encode(b"C:/LSB/1.jpg", b"C:/LSB/1.txt")
lsb.decode(b"C:/LSB/1.jpg_copy.png", b"C:/LSB/out.txt")
LSB.py
mport sys
importstruct
from PIL import Image
classLSB:
#Метод для преобразования текста в массив бит
def decompose(self, data):
v = []
# Представим размер текстового файла ввиде массива из 4 байт
fSize = len(data)
bytes = [b for b in struct.pack("i", fSize)]
# Добавим в массив байты символов текста
bytes += [b for b in data]
# Составим из массива байт массив бит
for b in bytes:
fori in range(7, -1, -1):
v.append((b >>i) & 1)
return v
#Метод для преобразования массива бит в текст
def assemble(self, v):
bytes = b""
length = len(v)
foridx in range(0, len(v) // 8):
byte = 0
fori in range(0, 8):
if (idx * 8 + i< length):
byte = (byte << 1) + v[idx * 8 + i]
bytes = bytes + byte.to_bytes(1, byteorder='big')
payload_size = struct.unpack('i', bytes[0:4])[0]
return bytes[4: payload_size + 4]
#Устанавливаетiбит x байта
defset_bit(self, n, i, x):
mask = 1 <
n&= ~mask
if x:
n |= mask
return n
#Метод для встраивания текста в изображение
def encode(self, imgFile, payload):
# Получаем исходное изображение
img = Image.open(imgFile)
(width, height) = img.size
conv = img.convert("RGBA").getdata()
print("Размер изображения: %dx%d пикселей" % (width, height))
#Максимальный размер текста
#1pxRGBA = 4 Байта
max_size = width * height * 3.0 / 8 / 1024 #КБайт
print("Максимальный размер текста: %.2fКБайт" % (max_size))
f = open(payload, "rb")
data = f.read()
f.close()
print("Размертекста: %.2f KB " % (len(data) / 1024.0))
# Преобразуем текст в массив бит (первые 32 бита - размер текста)
v = self.decompose(data)
# Добавим нули чтобы размер был кратен 3
while (len(v) % 3):
v.append(0)
# КолличествоКБайт в тексте
payload_size = len(v) / 8 / 1024.0
if (payload_size>max_size - 4):
print("Невозможно выполнить стеганографию!")
sys.exit()
# Создаем выходное изображение
steg_img = Image.new('RGBA', (width, height))
data_img = steg_img.getdata()
# Добавляем в RGB байты в качестве последнего бита биты текста
...