【发布时间】:2011-03-02 04:14:31
【问题描述】:
假设一个已知的 SHA1 哈希是通过连接多个数据块计算得出的,并且这些块的连接顺序是未知的。找到给出已知散列的块顺序的直接方法是为每个可能的排序计算一个 SHA1 散列,直到找到已知散列。
是否可以通过分别为每个块计算 SHA1 哈希然后仅通过操作哈希来找到块的顺序来加快这一速度?
【问题讨论】:
标签: hash
假设一个已知的 SHA1 哈希是通过连接多个数据块计算得出的,并且这些块的连接顺序是未知的。找到给出已知散列的块顺序的直接方法是为每个可能的排序计算一个 SHA1 散列,直到找到已知散列。
是否可以通过分别为每个块计算 SHA1 哈希然后仅通过操作哈希来找到块的顺序来加快这一速度?
【问题讨论】:
标签: hash
简而言之,没有。
如果您使用 SHA-1,由于 Avalanche Effect ,明文(在您的情况下是您的块)中的任何微小变化都会显着改变其对应的 SHA-1。
假设你有 4 个块:A B C 和 D, A+B+C+D (concated) 的 SHA1 哈希假定与 A、B、C 和 D 的 SHA1 哈希不相关 单独计算。
由于它们不相关,您无法在连接块(A+B+C+D、B+C+A+D 等)和每个单个块( A、B、C 或 D)。
如果你能识别出两者之间的任何关系,那么 SHA1 散列算法就会出现问题。
【讨论】:
实际答案:不。如果您使用的散列函数有任何好处,那么它应该看起来像 Random Oracle,在尝试输入之前,它在精确给定输入上的输出是完全未知的。因此,在您找到您正在寻找的确切输入顺序之前,您无法从计算的哈希中推断出任何东西。 (严格来说,可能存在一个散列函数,它具有散列函数的通常属性,即碰撞和原像阻力,而不是随机预言,但偏离 RO 模型仍然被认为是散列函数的弱点。)(严格来说,为单个无键函数谈论随机预言有点不恰当。)
理论答案:视情况而定。为简单起见,假设您有 N 个 512 位的块,那么您可以安排成本不超过 N*2160 个基本SHA-1 的评估,当 N >= 42 时低于 N!。这个想法是 SHA-1 的运行状态,在两个连续的块之间,被限制为 160 位。当然,无论如何,这个成本是荒谬的。更一般地说,您的问题是关于使用自定义集 S 中的输入找到 SHA-1 的原像(您的 N 的 N! 序列块),因此成本具有 S 的大小和 SHA-1 的原像电阻的下限,以较低者为准。 S的大小为N!,随着N的增加,它增长得非常快。 SHA-1 在原像方面没有已知的弱点,因此仍假定其阻力约为 2160(因为它具有 160 位输出)。 p>
编辑:这种问题适用于proposed "cryptography" stack exchange,当(如果)它被实例化时。请承诺帮助创建它!
【讨论】:
根据您的散列库,这样的事情可能会起作用:假设您有块 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 哈希需要按顺序放置块。下一个散列块的计算需要当前散列块的输出。如果不是这样,那么操作文档会容易得多,这样您就可以随意重新排序块,这将大大降低算法的实用性。
【讨论】: