【问题标题】:Is there a universal function F that F(sha(a),sha(b)) = sha(ab)是否存在一个通用函数 F 满足 F(sha(a),sha(b)) = sha(ab)
【发布时间】:2018-11-10 22:44:32
【问题描述】:

我需要分批发送我的数据,同时我需要为我的整个数据提供 sha256。

类似cat large file | chunker | receiver 其中接收器是预期接收数据的应用程序,可能在有效负载的标头 sha256 中的块中,然后是有效负载。收集完所有的chunk后,它应该存储整个传输的数据,以及所有数据的sha256(特定的sha256将仅用于rehash和确认数据的完整性。)

当然,最简单的事情是接收器从整个流数据中生成 sha256,但我想知道是否有一种更简单的方法,即收集所有块的所有哈希,并将它们组合起来生成一个最终哈希,即将与根据所有数据计算的哈希值相同。

换句话说 - 我从标题中复制了这个 - 我想知道是否有一个函数 F 可以接收数据块的散列列表,然后生成最终的散列值,该散列值等于所有生成的散列值数据。

再一次,换句话说,有这个公式: F(sha256(data[0]), sha256(data[1]), ... sha256(data[N])) = sha256(data[0..N])

函数 F 是什么? 它会是一个通用函数还是没有这种计算哈希的方式?

我怀疑没有这样的功能,或者这个问题太复杂而无法回答。

【问题讨论】:

  • 散列操作的结果没有包含足够的信息来继续散列操作,其中包括散列算法本身内的所有状态信息。

标签: math hash sha


【解决方案1】:

AFAIK 仍然没有已知的 SHA-256 冲突,但我敢打赌,一旦找到一些,即有人找到两条消息 m1 和 m2 这样 SHA-256(m1) = SHA-256(m2),然后对于几乎任何前缀 a 哈希SHA-256(a || m1) 和 SHA-256(a || m2) 会有所不同,即您要求的函数实际上不是函数(对于相同的输入具有不同的输出)。或者换句话说,SHA-2 容易受到长度扩展攻击,但 AFAIK 不会受到前缀攻击。尽管如此,即使这实际上是一个函数,对于你来说这样的函数存在是不够的,你还希望它快。而且我相信没有这么快的计算功能。

另一方面,SHA-256 的工作原理是将原始消息拆分为 512 位块并使用定义明确的过程(基于所有先前块的状态)处理它们,因此理论上您可以修改一些实现SHA-256 同时计算两个哈希(通过将相同的逻辑应用于不同的初始状态):

  1. 应用程序定义块的哈希(使用标准初始状态)
  2. 到目前为止所有块的哈希(使用从同一步骤的上一个输出传递的状态作为初始状态)。

这可能会比独立做这些事情稍微快一些,但我不知道证明这样的自定义实现是否会快得多。

【讨论】:

  • 我所知道的所有加密库都已经提供了一个 API,它可以为哈希和(散装/对称)执行“初始化/设置、处理一个或多个(任意数量)输入块、完成/清理” ) 密码
  • @dave_thompson_085,与在整个数据上独立运行的 SHA-256 相比,我看不出这会如何提高速度。我看到的唯一(小)机会是同时处理每个块两次,这样在内存访问方面会更有效率。
  • @dave_thompson_085 - 从我读过的 cmets 来看,这个过程不会以等于由整个数据产生的哈希值结束。我说的对吗?
  • @Grzegorz,您指的是哪个进程? SHA-2 所做的从高层次上可以描述为每个块重复两个步骤 1. 使用一些初始状态来破坏数据块 2. 使用被破坏的块来更新状态。初始状态也有一些默认值(即在第一个块之前)。没有什么可以强迫您在同一运行中处理所有块。您可以保存当前状态并将其用作下一批块的新初始状态(而不是默认状态),结果将与您将两个批次作为一个整体进行处理一样。
  • 但是如果你从默认初始状态开始的每批块,没有简单的方法将这些哈希合并到整个数据的正确输出中,实际上我打赌不可能进行合并因为它不是确定性的结果。
猜你喜欢
  • 2023-03-27
  • 2014-06-13
  • 2019-08-29
  • 2012-06-26
  • 2018-06-27
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多