Большое большое спасибо. Я использовал эту идею и создал фиксированный стандарт для всех типов файлов.
троилСтеганограф Питона и я пытаюсь добавить графический интерфейс к нему. Послемой предыдущий вопрос относительно чтения всех видов файлов в Python. Поскольку стеганограф может кодировать только байты в изображении. Я хочу добавить поддержку для прямого кодирования файла любого расширения и кодирования в нем. Для этого я читаю файл в двоичном формате и пытаюсь его кодировать. Он отлично работает для файлов, которые в основном содержат простой текст UTF-8, потому что он может легко кодировать.txt
а также.py
файлы.
Мой обновленный код:
from PIL import Image
import os
class StringTooLongException(Exception):
pass
class InvalidBitValueException(Exception):
pass
def str2bin(message):
binary = bin(int.from_bytes(message, 'big'))
return binary[2:]
def bin2str(binary):
n = int(binary, 2)
return n.to_bytes((n.bit_length() + 7) // 8, 'big')
def hide(filename, message, bits=2):
image = Image.open(filename)
binary = str2bin(message) + '00000000'
if (len(binary)) % 8 != 0:
binary = '0'*(8 - ((len(binary)) % 8)) + binary
data = list(image.getdata())
newData = []
if len(data) * bits < len(binary):
raise StringTooLongException
if bits > 8:
raise InvalidBitValueException
index = 0
for pixel in data:
if index < len(binary):
pixel = list(pixel)
pixel[0] >>= bits
pixel[0] <<= bits
pixel[0] += int('0b' + binary[index:index+bits], 2)
pixel = tuple(pixel)
index += bits
newData.append(pixel)
image.putdata(newData)
image.save(os.path.dirname(filename) + '/coded-'+os.path.basename(filename), 'PNG')
return len(binary)
def unhide(filename, bits=2):
image = Image.open(filename)
data = image.getdata()
if bits > 8:
raise InvalidBitValueException
binary = ''
index = 0
while not (len(binary) % 8 == 0 and binary[-8:] == '00000000'):
value = '00000000' + bin(data[index][0])[2:]
binary += value[-bits:]
index += 1
message = bin2str(binary)
return message
Теперь проблема возникает, когда я пытаюсь скрыть.pdf
или же.docx
файлы в нем. Происходит несколько вещей:
1) Microsoft Word или Adobe Acrobat показывает, что файл поврежден.
2) Размер файла значительно уменьшен с 40 КБ до 3 КБ, что является явным признаком ошибки.
Я думаю, что причиной этого может быть то, что файл содержит чтение символов NULL, которое моя программа не читает далее. У вас есть альтернативная идея для этого?
У меня есть идея изменить конечный байт, но он все равно может иметь такой же результат, как файл может содержать этот байт.
Еще раз спасибо!