当前位置: 首页 > 面试题库 >

python-非纯文本文件的Steganographer文件处理错误

桑睿识
2023-03-14
问题内容

我已经建立了Python
Steganographer,
并尝试向其中添加GUI。在我之前的有关读取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)文件大小从40KB减少到3KB,这是明显的错误迹象。

我认为其背后的原因可能是该文件包含NULL字符读取,而我的程序没有进一步读取。您对此有其他选择吗?

我有一个更改结束字节的想法,但是它可能仍然具有与文件可能包含该字节相同的结果。

再次感谢!


问题答案:

当您确定标记序列不会显示在消息流中时,可以使用和流结束(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


 类似资料:
  • Web开发中对于文本处理是非常重要的一部分,我们往往需要对输出或者输入的内容进行处理,这里的文本包括字符串、数字、Json、XMl等等。Go语言作为一门高性能的语言,对这些文本的处理都有官方的标准库来支持。而且在你使用中你会发现Go标准库的一些设计相当的巧妙,而且对于使用者来说也很方便就能处理这些文本。本章我们将通过四个小节的介绍,让用户对Go语言处理文本有一个很好的认识。 XML是目前很多标准接

  • 6.6.3 FlatFileItemWriter 将数据写入到纯文本文件也必须解决和读取文件时一样的问题。 在事务中,一个 step 必须通过分隔符或采用固定长度的格式将数据写出去. LineAggregator 与 LineTokenizer 接口的处理方式类似, 写入文件时也需要有某种方式将一条记录的多个字段组织拼接成单个 String,然后再将string写入文件. Spring Batch

  • 6.6.2 FlatFileItemReader 译注: 本文中 将 Flat File 翻译为“平面文件”, 这是一种没有特殊格式的非二进制的文件,里面的内容没有相对关系结构的记录。 平面文件(flat file)是最多包含二维(表格)数据的任意类型的文件。在 Spring Batch 框架中 FlatFileItemReader 类负责读取平面文件, 该类提供了用于读取和解析平面文件的基本功能

  • 问题内容: 我处理了许多在Python,R以及有时在Matlab之间交换的文本/数据。 我要去的是纯文本文件,但偶尔也使用SQLite来存储数据和从每个程序进行访问(虽然还不是Matlab)。我不像在R中那样在SQL中使用GROUPBY,AVG等,因此我不一定需要数据库操作。 对于此类需要在程序之间交换数据以使用每种语言的可用库的应用程序,是否存在使用哪种数据交换格式/方法(甚至XML,NetCD

  • 问题内容: 我有一系列使用Beautiful Soup解析为单个文本文件的HTML文件。HTML文件的格式设置为使其输出始终为文本文件中的三行,因此输出将类似于: 但这很容易 换句话说,HTML文件的内容在每个文件中并不是真正的标准,但是它们始终会产生三行。 因此,我想知道如果我想从Beautiful Soup生成的文本文件然后将其解析为带有以下内容的列的CSV文件(使用上面的示例),应该从哪里开

  • 本文向大家介绍python处理文本文件并生成指定格式的文件,包括了python处理文本文件并生成指定格式的文件的使用技巧和注意事项,需要的朋友参考一下