我已经建立了PythonSteganographer,并尝试向其中添加GUI。在我之前的有关读取Python中各种文件的问题之后。因为,隐写术者只能对图像中的字节进行编码。我想添加支持以直接编码任何扩展名的文件并在其中进行编码。为此,我正在读取二进制文件并尝试对其进行编码。对于基本上包含纯文本UTF-8的文件,它可以正常工作,因为它可以轻松编码.txt和.py文件。
.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文件进去。发生了几件事:
.pdf
.docx
1)Microsoft Word或Adobe Acrobat显示文件已损坏。
2)文件大小从40KB减少到3KB,这是明显的错误迹象。
我认为其背后的原因可能是该文件包含NULL字符读取,而我的程序没有进一步读取。您对此有其他选择吗?
我有一个更改结束字节的想法,但是它可能仍然具有与文件可能包含该字节相同的结果。
再次感谢!
当您确定标记序列不会显示在消息流中时,可以使用和流结束(EOS)标记。当您不能保证时,有两种选择:
通常,只要我事先知道要传输的信息,便会使用标头,并且仅在不知道字节流何时终止(例如动态压缩)时才依赖EOS标记。
进行嵌入时,您应该致力于:
并提取:
另外,您可以在标头中添加各种信息,例如原始文件的名称。只要所有内容都以某种方式编码,您以后就可以提取它。例如。
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