Большое большое спасибо. Я использовал эту идею и создал фиксированный стандарт для всех типов файлов.

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

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

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

Ответы на вопрос(1)

Ваш ответ на вопрос