Hash 为附加数据的文件快速生成新的SHA-1哈希

Hash 为附加数据的文件快速生成新的SHA-1哈希,hash,openssl,sha1,Hash,Openssl,Sha1,以下是我的设想: 我有一个已生成SHA-1哈希的现有文件,但不一定在程序的当前运行中。所以我有了散列,但没有可以继续的散列上下文(即OpenSSL中的SHA_CTX) 我将向同一个文件添加新数据,我需要重新计算它的SHA-1哈希 所以我的问题是,是否有可能利用我已经拥有了部分文件的散列的事实,从那一点开始继续新的散列计算以节省时间?如果是的话,我会怎么做 请注意,我目前正在使用OpenSSL生成哈希,但我对其他选项持开放态度(只要它们是跨平台的)。SHA-1的输入包含消息长度和一些填充。 发

以下是我的设想:

  • 我有一个已生成SHA-1哈希的现有文件,但不一定在程序的当前运行中。所以我有了散列,但没有可以继续的散列上下文(即OpenSSL中的SHA_CTX)
  • 我将向同一个文件添加新数据,我需要重新计算它的SHA-1哈希
所以我的问题是,是否有可能利用我已经拥有了部分文件的散列的事实,从那一点开始继续新的散列计算以节省时间?如果是的话,我会怎么做


请注意,我目前正在使用OpenSSL生成哈希,但我对其他选项持开放态度(只要它们是跨平台的)。

SHA-1的输入包含消息长度和一些填充。 发件人:

预处理:
将位“1”附加到消息
追加0≤ k<512位“0”,因此生成的消息长度(以位为单位)
与448一致≡ −64(模块512)
附加消息长度(预处理前),以位为单位,作为64位大端整数
这意味着您不能简单地从SHA-1摘要继续,因为它本身已经包含数据的大小以及为其计算的块的填充


SHA-1的内部状态为160位,没有它们,您无法为较长的块计算新的SHA-1摘要。这就是OpenSSL函数有一个“最终”调用的原因——它必须在最后调用一次。在此之前,您必须以某种方式(通过SHA-1上下文或其他方式)保持内部状态。

对,这是有道理的。因此,需要明确的是:如果我在执行finalize调用之前保存了上下文数据结构的内容,然后在以后重新加载并继续处理新数据,应该可以正常工作?@codely-是的,上下文保存了您需要的所有内容。据我所知,它是一个“扁平”结构,因此您可以复制整个内容(例如使用memcpy)并使用fwrite/fread保存/加载(在同一台机器上!否则您会遇到麻烦)。完美。我将通过比较完整文件的SHA-1散列与从同一文件的一部分生成的散列,保存上下文,加载它,然后继续,来验证它是否有效。为了涵盖所有可能的差异来源,我将在单独的过程中加载并继续。
Pre-processing:
append the bit '1' to the message
append 0 ≤ k < 512 bits '0', so that the resulting message length (in bits)
   is congruent to 448 ≡ −64 (mod 512)
append length of message (before pre-processing), in bits, as 64-bit big-endian integer