【问题标题】:Is it possible for compression algorithms to generate identical output for two different files?压缩算法是否可以为两个不同的文件生成相同的输出?
【发布时间】:2009-07-17 18:56:31
【问题描述】:

我想知道压缩算法是否总是为两组不同的文件生成唯一的输出。

假设我有两个文件 A 和 B,并假设我正在为每个文件应用压缩算法(例如 PKZIP - 这可以是任何压缩算法)以分别获取 A.zip 和 B.zip。对于 A 和 B 的某种组合,A.zip 是否有可能在二进制级别与 B.zip 完全相同?如果这不可能,我们可以安全地假设压缩等同于加密散列,以保证唯一性?另一方面,如果可能的话,能否请您提供一个示例 A 和 B 文件以及用于验证这种重复性的压缩算法?

【问题讨论】:

  • 您提到“加密哈希”让一些人认为您打算出于安全目的使用无损压缩——对吗?如果是这样,这是一个糟糕的主意,因为他们给出的所有理由。但是,如果您只对保证唯一性感兴趣,并且准备处理压缩给您的可变长度输出,那么它可能是一个合理的选择(尽管出于所有实际目的,使用固定长度的加密哈希会更快并且运行良好——与例如 128 位密钥发生密钥冲突的可能性不可忽略)。

标签: algorithm compression hash unique


【解决方案1】:

无损压缩(在 ZIP 文件中使用)总是会为不同的文件产生不同的输出 - 否则您将无法可靠地恢复原始数据。但是,输出数据可以是任意大小 - 对于某些输入,它会大于原始输入。因此,这作为散列通常不是很有用,散列通常需要固定大小的输出。

有损压缩(例如 MP3、JPEG 等)可以为不同的输入产生相同的输出 - 因此,您无法恢复原始数据,而是得到类似的东西。因此,pigeonhole principle 不是问题,因此您可以保证它会减小输出大小,通常甚至指定所需的输出大小。然而,由于相似但略有不同的输入通常会产生相同的输出,这对于散列也没有用处,因为散列需要输入的微小变化才能产生输出的大变化。

【讨论】:

  • 鸽巢原理+1,因为我对数学很痴迷。但是,这是否解决了加密哈希问题?
  • 当然。无损不起作用,因为它是可变大小的,有损是因为小的变化不会导致大的散列变化(雪崩效应)。
  • @bdonian 对具有固定长度的哈希有什么要求?此外,“丢失”信息(即有损)的想法并不能阻止算法成为一个好的散列。 MD5 或 SHA-1 是有损压缩算法,不是吗?我认为这里要注意的重要一点是,所有加密哈希函数都是压缩算法,而不是相反。 (加密哈希函数必须“难以”反转)而且,在说了之后,我确实注意到这与我在下面的回答有些矛盾:P
  • 我从来没有说过丢失信息会阻止某些东西成为一个好的哈希值。事实上,任何好的散列都会丢失所有信息(即,您根本无法恢复有关原始消息的任何信息)。此外,通常哈希值小于输入消息,而无损压缩算法无法确保这一点。
【解决方案2】:

这是不可能的。如果压缩后的文件是一样的,解压后怎么会产生不同的结果呢?

【讨论】:

  • 清晰简单:+1。请注意,这仅适用于无损压缩(OP 通过谈论 PKZIP 建议,但未明确提及)。
  • 当我写答案时,由于问题的措辞方式,我什至没有考虑有损压缩的可能性。感谢您的澄清。
【解决方案3】:

当然,有损压缩可以提供与前面提到的相同的输出。

但我认为没有提到的一个非常重要的一点是加密哈希应该很难反转(或通过两个不同的输入重现相同的哈希)。由于这个原因,像 zips 这样的无损压缩算法不适合作为加密哈希。

【讨论】:

  • +1 指出压缩作为一种安全措施是无用的,但我认为 OP 的主要兴趣在于仅使用压缩输出来保证唯一性——并且保证唯一性是无损压缩所做的事情 甚至比加密哈希更好(尽管产生可变长度输出的明显缺点)。
【解决方案4】:

f 为压缩算法。如果压缩AB 产生相同的文件,那么对于某些Cf(A) = f(B) = C。现在,设 f' 为解压算法。那么f'(f(A)) = f'(C) = f'(f(B))。因此,f'A.zipB.zip 解压缩到同一个文件中。

所以,要么 f 是一个毫无价值的压缩算法(因为它不是双射),要么AB 实际上是同一个文件。 (当我说无价值时,我的意思是无损压缩毫无价值!)

至于您的其他问题,请注意无损压缩算法根据定义 not 是散列算法,因为散列函数 h 映射域 A 在(通常)较小的域 B 上。因此 h 不能 是双射,而我们只是断言我们的无损压缩函数 f 双射。

【讨论】:

  • 无用的有点强;有损(即非双射)算法一直用于音频和图像
  • @bdonlan:你是对的。我更新了答案以澄清我所说的“毫无价值”:)
【解决方案5】:

应该很明显了:如果压缩后的文件都是一样的,那么解压器怎么知道是用A还是B呢??

不过,这不会产生可用的散列,因为长度是可变的。

【讨论】:

    【解决方案6】:

    要求压缩函数是单射的,即每个输入映射到一个唯一的输出。如果不是这样,算法如何知道是解压回 A 还是 B?

    请注意,这仅适用于无损(数据)压缩。例如,可以压缩 2 张图像并获得相同的结果,但前提是图像开始时非常接近。

    【讨论】:

      【解决方案7】:

      好吧,您的问题有点笼统,但是由于您指出了基于文件的压缩算法(一件事是您的 pkzip 标记),所以没有。两种不同的无损压缩算法不可能从不同的输入产生相同的输出。

      但是,对于像 JPEG 这样的有损压缩算法,当然,这当然是可能的,但是文件一开始就几乎相同。

      例如,获取一个 .PNG 文件,将其另存为 .JPEG,更改一个像素使其在其中一个通道中变亮或变暗 1 度,然后将其重新保存为 .JPEG,您就有机会获得两个相同的文件,即使输入不同,尽管略有不同。

      所以无损算法,不,这不可能发生。对于有损算法,是的。

      【讨论】:

        【解决方案8】:

        加密散列函数有一个非常具体的要求:使它们很难反转。根据定义,压缩很容易反转,因此对于加密哈希来说,它是一个非常糟糕的选择。

        编辑:

        请注意,当我在上面说“按定义”时,我指的是传统定义。严格来说,MD5、SHA-1等也可以算作压缩算法。

        【讨论】:

          【解决方案9】:

          仅适用于lossy compression 算法(与lossless data compression 相反)。理论上,对于相似(但仍然不同)的输入数据,它们可以给出相同的结果。

          【讨论】:

            【解决方案10】:

            对于一个像样的加密散列算法来说,输入中的一个小的局部变化应该会导致输出的一个大的分散变化。此外,哈希函数是从任意大小的输入到固定大小的输出的映射。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多