是否可以仅使用校验和系统传输大文件,然后通过计算重建原始文件?
假设您传输文件的MD5校验和以及文件的大小.通过制作“虚拟文件”并计算它的校验和,尝试每个位组合,最终应“到达”原始文件.但在途中你也会遇到很多“碰撞”,校验和也会匹配.
因此,我们将原始文件的第一个字节更改为某个指定值,再次计算校验和,并发送它.如果我们在虚拟文件中进行相同的替换,我们可以测试每个“碰撞”以查看它是否仍然匹配.这应该缩小一点,我们可以做几次.
当然,这样做的计算能力将是巨大的.但理论上是否可行,你需要传递多少校验和(比如说1mb)?或者传输校验和所需的数据量可能几乎和文件一样大,这使得它毫无意义?
最佳答案 您需要传输的数据量肯定与文件大小相同.考虑一下:如果你可以用n-1字节的数据传递一个字节文件,这意味着你可能已经发送了256 ^(n-1)种可能的数据模式,但是从256 ^ n的空间中选择.这意味着使用此方法无法表达每256个文件中的一个 – 这通常被称为
pidegonhole principle.
现在,即使这不是问题,也没有保证在任何给定数量的校验和之后你不会发生碰撞.校验和算法旨在避免冲突,但对于大多数校验和/散列算法,没有强有力的证明,在X哈希之后,您可以保证在N字节空间中不会发生冲突.
最后,哈希算法至少被设计为难以反转,因此即使可能,也需要不可能的大量CPU功率.
也就是说,对于类似的方法,你可能有兴趣阅读Forward Error Correction codes – 它们根本不是哈希算法,但我认为你可能会发现它们很有趣.