是否可以仅使用校验和系统传输大文件,然后通过计算重建原始文件?
假设您传输文件的MD5校验和以及文件的大小 . 通过制作“虚拟文件”并计算其校验和,尝试每一位组合,您最终应“到达”原始文件 . 但在途中你也会遇到很多“碰撞”,校验和也会匹配 .
因此,我们将原始文件的第一个字节更改为某个指定值,再次计算校验和,并发送它 . 如果我们在虚拟文件中进行相同的替换,我们可以测试每个“碰撞”以查看它是否仍然匹配 . 这应该缩小一点,我们可以做几次 .
当然,这样做的计算能力将是巨大的 . 但理论上是否可行,你需要传递多少校验和(比如说1mb)?或者,传输校验和所需的数据量可能几乎与文件一样大,这使得它毫无意义?
5 回答
您需要传输的数据量肯定与文件大小相同 . 考虑一下:如果您可以使用
n-1
字节的数据传送n
字节文件,这意味着您可能已经发送了256^(n-1)
可能的数据模式,但是正在从大小为256^n
的空间中进行选择 . 这意味着使用此方法无法表达每256个文件中的一个 - 这通常被称为pidegonhole principle .现在,即使这不是问题,也没有保证在任何给定数量的校验和之后你不会发生碰撞 . 校验和算法旨在避免冲突,但对于大多数校验和/散列算法,没有强有力的证明,在X哈希之后,您可以保证在N字节空间中不会发生冲突 .
最后,哈希算法至少被设计为难以反转,因此即使可能,也需要不可能的大量CPU功率 .
也就是说,对于类似的方法,您可能有兴趣阅读Forward Error Correction codes - 它们根本不是哈希算法,但我认为您可能会觉得它们很有趣 .
你在这里有一个信息问题 . 校验和不一定对特定数据集是唯一的,事实上它实际上需要有许多位信息作为源 . 它可以表明收到的数据不是生成校验和的确切数据,但在大多数情况下它无法证明 .
总之“不” .
举一个假设的例子,考虑一张带有6个像素的24 bpp照片 - 这六个像素的每个颜色通道有2 ^(24 * 6)(2 ^ 144)种可能的强度组合,所以你可以保证,如果你要评估每种可能性,保证MD5冲突(因为MD5是128位数) .
简短的回答:没有任何有意义的形式 .
答案很长:
让我们假设一个1000字节大小的任意文件
file.bin
. 有2^(8*1000)
个不同的组合可能是它的实际内容 . 通过发送例如一个1000位的校验和,你仍然有大约2^(7*1000)
碰撞的替代品 .通过发送一个额外的位,您可以将这些减少一半......并且您仍然有
2^6999
冲突 . 当您消除了分数时,您将发送至少8000位,即与文件大小相等或更大的数量 .唯一的方法是理论上这可能(注意:我没有说"feasible",更不用说"practical")如果文件实际上不包含随机数据,你可以使用这些知识修剪替代品 . 在那种情况下,你最好使用压缩,不管怎么说 . 内容感知压缩算法(例如,用于音频的FLAC)使用关于输入数据的属性的先验知识来提高压缩比 .
我认为你所想的实际上是一个有趣的话题,但你没有找到正确的方法 . 如果我可以尝试重新解释你的问题,你会问是否有办法将函数应用于某些数据,传输函数的结果,然后从terser函数结果重建原始数据 . 对于单个MD5校验和,答案是否定的,但对于其他函数,只要您愿意发送多个函数结果,就有可能 . 一般来说,这个研究领域被称为compressed sensing . 有时精确重建是可能的,但更常见的是用作图像和其他视觉或声音数据的有损压缩方案 .