【问题标题】:Can a file end with a 0x80 char?文件可以以 0x80 字符结尾吗?
【发布时间】:2014-09-30 15:55:21
【问题描述】:

我正在实现我自己的河豚编码器/解码器版本。如有必要,我使用 0x80 的标准填充。

我的问题是我是否需要添加一个填充字符,即使我不需要它,因为对于一个自然以 0x80 结尾的文件,在 deconding 部分我将删除这个字符,但在这种情况下这是一个错误的操作,因为 te 0x80 是文件本身的一部分。

这当然可以通过添加最终字符来解决,即使字符总数是编码块的倍数(本例中为 64 位)。我可以实施这个对策,但首先我想知道我是否真的需要它。

自然的后果是考虑是否选择这种类型的字符,因为文件中从未发生过(因此上述错误情况永远不会发生),但我完全不确定。

谢谢!很抱歉这个愚蠢的问题..

【问题讨论】:

  • 您的问题可能与操作系统(和文件系统)有关。在 Linux 和大多数其他 Posix 操作系统(及其本机文件系统)上,文件可以包含任意字节的任意序列。所以它可以以0x80 结尾
  • 填充是输入/输出数据格式的一部分。作为您提供给解码器的数据的一部分或从编码器输出的数据与可能也在同一文件中的其他数据之间不能有任何混淆(这就是使用填充的原因之一 - 例如每个块的长度可以是已知的。)
  • 这个问题不是特定于操作系统的,至少关于文件中可以出现哪些字节。二进制文件(并且您总是希望使用二进制文件)可以包含任何字节。不符合 POSIX 的操作系统可能会用零字节填充二进制文件的末尾,这会使问题变得不简单,但不能禁止 0x80。
  • 您可以手动添加填充;如果文件以0x80 字符结尾,则用其他字符填充。如果不需要填充,请添加一个填充有您选择的填充字符的块。这样,最后一个字符会告诉您选择的填充字符。因此,要取消填充,请读取最后一个字符(当然是从解密的内容中)并修剪这些字符。这样,您将永远不会修剪已成为原始内容一部分的字符。 编辑:哦,我刚刚看到你有这个想法。但如果文件以0x80 结尾,请确保选择不同的字符。
  • 谢谢大家。我看看添加最后 8 个字节是否会在我的算法同步中造成一些灾难。当然,填充仍然可以是 0x80,因为当我检查它时,我会在第一次出现这个字符时停止。

标签: c++ c padding blowfish


【解决方案1】:

在 Linux 和其他文件系统上,文件可以包含任意字节的任意序列。所以理想情况下,你不能依赖任何特定的字节来决定文件结束。 (虽然EOF在那里..!!)

我建议的是大多数文件格式正在使用。

您的文件格式可以有特定的 4-5 魔术字节标题。然后你可以有剩余字节的大小。所以在一些字节之后你的最后一个字节就会在那里。

编辑:

在上述建议中,在编码器中,您需要在文件中添加任何新数据后更新文件大小。

如果您不希望这样,那么您可以将数据编码为特定的数据块,然后逐包对其进行编码。您的文件将是一些数据包的编号。这些东西用在 NAL 单元中

【讨论】:

    【解决方案2】:

    Blowfish 是一种分组密码。它始终采用 64 位输入并输出 64 位输出。如果要加密不是 64 位长度的倍数的流,则需要添加一些填充字节。当您解密加密流时,您总是会得到 64 位的倍数。但是,如果加密流包含“真实”数据或填充字节,您将没有任何信息。您需要自己跟踪。一种简单的方法是存储“数据长度”和“加密流”的集合。另一种方法是在明文流前面加上数据长度值,例如 64 位无符号整数。然后在解密加密流之后,您将获得该长度作为第一个值,然后您就知道最后一个块中有多少字节是真实数据,有多少只是填充。

    关于文件末尾可以包含哪些字节的问题:任何。您可以拥有具有任意内容的文件。文件中的每个字节可以是任意值,没有限制。

    【讨论】:

      【解决方案3】:

      常规二进制文件可以包含任何字节序列,因此文件可以以 0x80、NULL 或任何其他结尾。

      如果你在谈论一些特定的标准,那么它取决于.. 但是我认为没有这样的文件类型最终不能包含一些特定的字符,我知道文件类型会忽略尽可能多的最后一个字符不需要(因为标题决定大小)所以你应该这样做,但从未听说过非法文件数据(破解除外)。


      如前所述,使用标头,例如保留确定大小的 8 个字节。这是一个简单的解决方案。


      另外,在问这样的问题之前,你应该问自己,为什么文件应该以一些特殊字符结尾?

      【讨论】:

        【解决方案4】:

        答案是肯定的。在当前使用的每个操作系统上,文件可以以任何可能的字节序列结尾。事实上,你应该生成这样一个文件来测试你的实现。

        在一般情况下,您无法识别尾随填充字符或在不知道文件长度的情况下可靠地删除它们。因此,对文件长度进行编码必须是您的加密协议的一部分。

        只需将文件的长度放在开头并加密整个内容,包括您喜欢的任何填充字节(随机可能是最好的)。未加密后,您将获得文件长度来告诉您截断位置。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-17
          • 2017-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多