使用零流优化更新MD5 / SHA1

是否可以优化function:

MD5_Update(&ctx_d, buf, num); 

如果你知道buf只包含零?

或者这在数学上是不可能的?

同样适用于SHA1。

如果你控制哈希函数的输入,那么你可以使用一个简单的计数而不是所有的零,可能使用某种类型的转义。 例如,hex中的000020可能意味着32个零。 (非常)基本压缩函数可能比MD5或SHA1快得多。

显然,如果您保存一个或多个哈希计算块,此解决方案将更快。 例如,如果您散列3个字节或16个字节并不重要,因为输入将在使用之前由散列函数填充和扩展。

实际上,对于输入中的微小变化,加密哈希实际上会产生显着的输出变化,请参阅http://en.wikipedia.org/wiki/Avalanche_effect 。 听起来你正在寻找一些散列数据之间的某种关系,以及一些预先用零填充的散列数据。 根据设计,您输入的这种变化应该产生不明显相关的输出。

编辑:直接回答你的问题,设计“密钥或明文的微小变化应该导致密文的急剧变化”,这意味着它在数学上很难做到。

你可能会获得一些加速,但它会相对较小。 高性能散列最重要的是选择优化的实现,并在可能的情况下使用GPU(甚至FPGA / ASIC)来利用并行性。

SHA-1有一个已知的加速比,固定的IV和消息只有一点点不同。 加速率约为21%。 看新攻击使密码破解更快–Ars Technica 。

当你有一个完全固定的消息但变量IV时,你可能得到类似的加速。 但要实现这一点需要做很多工作,特别是作为非专家。 购买额外的硬件可能比将代码加速几个百分点便宜得多。


如果消息的开头由多个常量块组成,则可以对它们进行一次哈希处理,并缓存哈希函数的中间状态。 可能适用于您的情况,也可能不适用。