python: error de manejo de archivos de Steganographer para archivos que no son de texto sin formato
He construidoun esteganógrafo de Python y estoy tratando de agregarle una GUI. Despuésmi pregunta anterior con respecto a la lectura de todo tipo de archivos en Python. Desde entonces, el steganographer solo puede codificar bytes en la imagen. Quiero agregar soporte para codificar directamente un archivo de cualquier extensión y codificarlo. Para esto, estoy leyendo el archivo en binario e intento codificarlo. Funciona bien para archivos que básicamente contienen texto sin formato UTF-8 porque puede codificar fácilmente.txt
y.py
archivos
Mi código actualizado es:
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
Ahora, el problema viene cuando trato de esconderme.pdf
o.docx
archivos en el mismo. Están sucediendo varias cosas:
1) Microsoft Word o Adobe Acrobat muestra que el archivo está dañado.
2) El tamaño del archivo se reduce considerablemente de 40 KB a 3 KB, lo que es una clara señal de error.
Creo que la razón detrás de esto podría ser que el archivo contiene una lectura de caracteres NULL que mi programa no lee más. ¿Tienes alguna idea alternativa para ello?
Tengo una idea para cambiar el byte final, pero aún puede tener el mismo resultado que un archivo puede contener ese byte.
¡Gracias de nuevo!