python - Erro de manipulação de arquivo do Steganographer para arquivos que não são de texto simples

Eu construíum esteganógrafo em Python e estou tentando adicionar uma GUI a ele. Depois deminha pergunta anterior sobre a leitura de todos os tipos de arquivos em Python. Desde então, o esteganógrafo pode codificar apenas bytes na imagem. Quero adicionar suporte para codificar diretamente um arquivo de qualquer extensão e codificação nele. Para isso, estou lendo o arquivo em binário e tentando codificá-lo. Ele funciona bem para arquivos que basicamente contêm UTF-8 em texto sem formatação porque podem codificar facilmente.txt e.py arquivos.

Meu código atualizado é:

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

Agora, o problema surge quando tento esconder.pdf ou.docx arquivos nele. Várias coisas estão acontecendo:

1) O Microsoft Word ou Adobe Acrobat mostra que o arquivo está corrompido.

2) O tamanho do arquivo é consideravelmente reduzido de 40 KB para 3 KB, o que é um claro sinal de erro.

Eu acho que a razão por trás disso pode ser que o arquivo contém uma leitura de caracteres NULL que meu programa não lê mais. Você tem alguma idéia alternativa para isso?

Eu tenho uma idéia para alterar o byte final, mas ele ainda pode ter o mesmo resultado que um arquivo pode conter esse byte.

Obrigado novamente!

questionAnswers(1)

yourAnswerToTheQuestion