python – Ошибка обработки файлов Steganographer для файлов без текста

Я построил Python Steganographer и стараюсь добавить к нему графический интерфейс. После моего предыдущего вопроса относительно чтения всех видов файлов в 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-символы, которые моя программа не читает дальше. Есть ли у вас альтернативная идея?

У меня есть идея изменить конечный байт, но он все равно может иметь тот же результат, что и файл, содержащий этот байт.

Еще раз спасибо!

One Solution collect form web for “python – Ошибка обработки файлов Steganographer для файлов без текста”

Вы можете использовать маркер и конечный поток (EOS), если вы уверены, что последовательность маркеров не будет отображаться в вашем потоке сообщений. Если вы не можете этого гарантировать, у вас есть два варианта:

  • создать более сложный маркер EOS, состоящий из множества байтов. Это может быть весьма неприятно, чтобы доказать, что одна и та же проблема не возникнет, как и раньше, или
  • Добавьте заголовок в начале вашего сообщения, которое кодирует количество бит / байтов для чтения для полного извлечения сообщений.

Как правило, я использую заголовок всякий раз, когда у меня есть информация заранее, которую я хочу передать, и полагаюсь только на маркеры EOS, когда я не знаю, когда закончится мой байт-поток, например сжатие «на лету».

Для внедрения вы должны стремиться:

  • получить двоичную строку
  • измерять его длину
  • преобразовать это целое число в двоичный файл фиксированного размера, скажем, 32 бита
  • прикрепите эту битовую строку перед вашей битовой строкой сообщения
  • встроить все это в свою среду покрытия

И для извлечения:

  • извлечь первые 32 бита
  • конвертировать их в целое число, чтобы получить длину битовой строки вашего сообщения
  • начинать с индекса 32 и извлекать необходимое количество бит
  • конвертировать обратно в байтовый поток и сохранять в файл

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

 header = 4 bytes for the length of the message string + 1 byte for the number of characters in the filename + that many bytes for the filename 
  • Как удалить объекты HTML в строке в Python 3.1?
  • Получение уникальных комбинаций из уникального списка элементов, FASTER?
  • Расшифровка файла в потоке и чтение потока в pandas (hdf или stata)
  • Варианты использования для __del__
  • Как интегрировать SimpleGUI с оболочкой Python 2.7 и 3.0
  • Установка и импорт модулей Python на OS X
  • Библиотека чтения Exif
  • Какая польза от аннотаций функции Python?
  • Python - лучший язык программирования в мире.