需要存储什么状态才能进行可恢复的哈希计算?

问题描述 投票:3回答:2

[这个问题仅与现实世界的问题间接相关,更没有兴趣了。我不了解当前的现实世界哈希算法如何在内部工作。

我确实知道典型的哈希计算(和CRC计算等)是递增工作的,并更新了某些状态依次为每个字节/字 [事实是,算法一次只工作一个块,尽管接口经常自动处理]。因此,可以在以后恢复部分完成的哈希计算-存储该状态,然后重新加载它,并从上次中断的地方继续。关于SO的问题已经存在,但似乎都与特定的库有关。

[根据CRC-16的古老知识(是的,实际上-由于过时的文件格式),我给人的印象是CRC值本身就是恢复恢复计算所需存储的所有状态。显然,实现可以用奇怪的方式编写,但是原则上到目前为止,所看到的文件部分内容的CRC-16是从该点恢复计算所需的完整状态。

现在使用的所有常见哈希计算是否正确?特别是MD5,SHA-1和SHA-256。还是必须存储一些其他(附加或替代)状态才能恢复计算?

显然,需要从文件中恢复的位置,但是除此之外,您需要存储什么精确状态才能恢复使用普通哈希函数的哈希计算。

要获得额外的奖励积分-我将如何在C ++中使用Crypto ++访问该状态? (指向文档正确部分的链接或参考可能会很有帮助)。

我将其标记为“算法”,因为这里是重点-实际算法产生的要求,而不是任何特定语言或库的实现。

algorithm hash cryptography
2个回答
8
投票

[当今大多数加密散列,包括MD5SHA-1SHA-2系列,都是基于Merkle–Damgård construction

[在这种结构中,通过将输入分为固定长度的块来进行处理,然后一次将其输入一个“混合函数”,该函数将不可逆地将其与算法的内部状态一起洗牌(也是固定的-length位字符串)。在输入的末尾,生成的内部状态将进一步不可逆地转换以防止某些类型的攻击:

Diagram of the Merkle–Damgård hashing process

(即将发布的SHA-3哈希标准基于更新的cryptographic sponge construction,在某些细节上有所不同,但在此处讨论的一般级别上没有显着差异。]

如果不是用于长度填充和终结处理步骤,则可以只获取任何消息的哈希值,并使用它来计算该消息的哈希值,并附加一些额外的数据,就像使用CRC一样。 las,从密码的角度来看,这被认为是一件坏事,而最终确定步骤特别包含在过程中,以使其不可能。

因此,如果要在消息中间中断哈希处理并在以后恢复它,则需要获取内部状态字符串之前,它会经过填充和完成阶段。

((您可能还需要存储少量其他数据,例如到目前为止为正确长度填充而处理的块数,并且,如果哈希在块中间被中断,则还没有任何部分输入块输入混合功能。)


[大多数密码库使用散列对象实现散列算法,该散列对象存储内部状态并允许以任意片段形式提供输入,例如(伪代码):

HashFunction hash = new SomeHashFunction();
hash.addInput( data );
// ...
hash.addInput( moreData );
BitString output = hash.finalize();

通常,即使散列对象可能不提供对其内部状态的直接访问,它们通常也会提供用于克隆和/或序列化自身的方法。我并不是特别熟悉Crypto++,但是乍一看,seems提供了Clone()方法。


Ps。如果您对使用加密哈希值进行文件完整性验证感兴趣,则可以查看universal hashing,尤其是基于多项式求值的通用哈希函数,例如GHASHPoly1305。这些是非常快速且可并行化的哈希函数,通常用作authenticated encryption方案的一部分,但也可以单独用作message authentication codes。关于它们的好处是,它们不仅可以增量计算,而且通过一些聪明的数学方法,如果对数据的[[middle进行了更改,它们甚至可以进行增量更新。它们的主要缺点是,要从密码上防止伪造(例如,创建具有相同散列的两个文件),则需要将其与密钥一起使用。


0
投票
@@ Mitch-我知道这是一个老话题,但是您的请求并不令人感兴趣。现在,在汽车世界中,这项新的FOTA功能(空中固件)可通过4G,WiFi等更新车辆固件(几个车载电子控制单元中的几个固件)。车辆可能会接收到固件中断(无网络区域,车辆关闭...)。因此,我们分几部分接收该软件,并且我们需要能够停止/恢复哈希计算(用于签名验证)。但是当前的汽车加密软件SW标准(Autosar)与例如PKCS#11标准。
© www.soinside.com 2019 - 2024. All rights reserved.