仅使用校验和传输文件?

时间:2011-01-21 13:08:27

标签: math checksum

是否可以仅使用校验和系统传输大文件,然后通过计算重建原始文件?

假设您传输文件的MD5校验和以及文件的大小。通过制作“虚拟文件”并计算它的校验和,尝试每个位组合,最终应“到达”原始文件。但在途中你也会遇到很多“碰撞”,校验和也会匹配。

因此我们将原始文件的第一个字节更改为某个指定值,再次计算校验和,并发送它。如果我们在虚拟文件中进行相同的替换,我们可以测试每个“碰撞”以查看它是否仍然匹配。这应该缩小一点,我们可以多次这样做。

当然,这样做的计算能力将是巨大的。但理论上是否可行,你需要传递多少校验和(比如说1mb)?或者也许传输校验和所需的数据量几乎和文件一样大,这使得它毫无意义?

5 个答案:

答案 0 :(得分:2)

您需要传输的数据量肯定与文件大小相同。考虑一下:如果您可以使用n个字节的数据传送n-1字节文件,这意味着您可能已经发送了256^(n-1)种可能的数据模式,但是从空间中进行选择大小为256^n。这意味着使用此方法无法表达每256个文件中的一个 - 这通常被称为pidegonhole principle

现在,即使这不是问题,也没有保证在任何给定数量的校验和之后你不会发生碰撞。校验和算法旨在避免冲突,但对于大多数校验和/散列算法,没有强有力的证据证明在X哈希后,您可以保证在N字节空间中不会发生冲突。

最后,哈希算法至少被设计为难以反转,因此即使可能,也需要不可能的大量CPU功率。

也就是说,对于类似的方法,您可能有兴趣阅读Forward Error Correction codes - 它们根本不是哈希算法,但我认为您可能会发现它们很有趣。< / p>

答案 1 :(得分:0)

这里有一个信息问题。校验和不一定对特定数据集是唯一的,事实上它实际上需要有许多位信息作为源。它可以表明收到的数据不是生成校验和的确切数据,但在大多数情况下它无法证明它。

答案 2 :(得分:0)

简短回答:没有任何有意义的形式。

答案很长:

让我们假设一个1000字节大小的任意文件file.bin。有2^(8*1000)种不同的组合可能是其实际内容。通过发送例如1000位校验和, 你仍然有大约2^(7*1000)碰撞的替代品。

通过发送一个额外的位,您可以将这些减少一半......并且您仍然会发生2^6999次碰撞。当您消除了分数时,您将发送至少8000位,即等于或大于文件大小的数量。

这在理论上是可行的唯一方法(注意:我没有说“可行”,更不用说“实用”了)如果文件实际上不包含随机数据,你可以使用这些知识来修剪替代品。在那种情况下,你最好使用压缩,不管怎么说。内容感知压缩算法(例如音频FLAC)使用输入数据属性的先验知识来提高压缩率。

答案 3 :(得分:0)

简而言之,“不”。

举一个假设的例子,考虑一张带有6个像素的24 bpp照片 - 这六个像素的每个颜色通道有2 ^(24 * 6)(2 ^ 144)种可能的强度组合,所以你可以保证如果您要评估所有可能性,则可以保证MD5冲突(因为MD5是128位数字)。

答案 4 :(得分:0)

我认为你所想的实际上是一个有趣的话题,但你还没有找到正确的方法。如果我可以尝试重新解释你的问题,你会问是否有办法将函数应用于某些数据,传输函数的结果,然后从terser函数结果重建原始数据。对于单个MD5校验和,答案是否定的,但对于其他函数,只要您愿意发送多个函数结果,就有可能。一般来说,这个研究领域称为compressed sensing。有时可以进行精确重建,但更常见的是将其用作图像和其他视觉或声音数据的有损压缩方案。