假设已知的 SHA1 哈希值是通过连接多个数据块来计算的,并且连接数据块的顺序未知。查找给出已知哈希值的块的顺序的直接方法是为每个可能的排序计算 SHA1 哈希值,直到找到已知哈希值。
是否可以通过为每个块单独计算 SHA1 哈希值,然后仅通过操作哈希值找到块的顺序来加快速度?
简而言之,不。
如果您使用 SHA-1,由于 雪崩效应,明文(在您的情况下是您的块)中的任何微小变化都会显着改变其相应的 SHA-1。
假设您有 4 个块:A B C 和 D, A+B+C+D(连接) 的 SHA1 哈希值假设与单独计算的 A、B、C 和 D 的 SHA1 哈希值不相关。
由于它们不相关,因此您无法在连接块(A+B+C+D、B+C+A+D等)和每个单独块(A、B、C或D)之间绘制任何关系.
如果您可以识别两者之间的任何关系,SHA1 哈希算法就会遇到麻烦。
实际答案:不。如果您使用的哈希函数很好,那么它应该看起来像一个“随机预言”,在尝试输入之前,其在精确给定输入上的输出是完全未知的。因此,在达到您要查找的确切输入顺序之前,您无法从计算的哈希中推断出任何内容。 (严格来说,“可能”存在一个哈希函数,它具有哈希函数的常见属性,即碰撞和原像抵抗性,而不是随机预言,但偏离 RO 模型仍然被认为是哈希函数的弱点。) (严格来说,谈论单个未加密函数的随机预言有点不合适。) 理论答案:这取决于。为简单起见,假设您有
N512 位块,那么您可以安排成本不超过 N*2160 SHA-1 的基本评估,低于 N! 当N >= 42。这个想法是,两个连续块之间的 SHA-1 运行状态限制为 160 位。当然,无论如何,这个成本都是可笑的不可行。更一般地说,您的问题是在自定义集合 S(您的 N 块的 N! 序列)中找到 SHA-1 的原像,因此成本具有 S 大小的下限 和 SHA-1 的原像抗性,以较低者为准。 S的大小是N!,当N增加时,它增长得非常快。 SHA-1 在原像方面没有已知的弱点,因此仍假设其电阻约为 2160(因为它具有 160 位输出)。 编辑:这种问题现在适用于
“密码学”堆栈交换。 根据您的哈希库,类似的操作可能会起作用:假设您有块 A、B、C 和 D。您可以处理块 A 的哈希,然后克隆该状态并计算 A+B、A+C,和A+D,而不必每次都重新计算A。然后您可以克隆其中的每一个,从 A+B 计算 A+B+C 和 A+B+D,从 A+C 计算 A+C+B 和 A+C+D,依此类推。
不。 计算完整的 SHA1 哈希值需要按顺序放置块。 下一个哈希块的计算需要当前哈希块的输出。 如果情况并非如此,那么操作文档就会容易得多,这样您就可以随意重新排序块,这将大大降低算法的有用性。