文件可以以0x80字符结尾吗?

时间:2014-08-07 12:01:29

标签: c++ c padding blowfish

我正在实现我自己的blowfish编码器/解码器版本。如果需要,我使用标准填充0x80。

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

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

自然结果是考虑选择这种类型的char是因为从未发生在文件中(所以上面的错误情况从未发生过),但我完全不确定。

谢谢!抱歉这个虚拟问题..

4 个答案:

答案 0 :(得分:4)

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

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

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

修改

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

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

答案 1 :(得分:3)

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

关于你在文件末尾可以有多少字节的问题:any。您可以拥有包含任意内容的文件。文件中的每个字节都可以是任何值,没有限制。

答案 2 :(得分:1)

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

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


如上所述使用header,保留例如确定大小的8个字节。这很容易解决。


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

答案 3 :(得分:1)

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

在一般情况下,如果不知道文件的长度,则无法识别尾随填充字符或将其删除。因此,编码文件的长度必须是加密协议的一部分。

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