【问题标题】:Optimise updating MD5/SHA1 with streams of zeros使用零流优化更新 MD5/SHA1
【发布时间】:2013-02-07 02:15:16
【问题描述】:

是否可以优化功能:

MD5_Update(&ctx_d, buf, num);

如果您知道buf 只包含零?

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

SHA1 也是如此。

【问题讨论】:

  • 您可能能够在两种算法的块散列步骤中优化许多迭代的第一次“迭代”。但除此之外,故意缺乏数学属性使得这(故意)难以/不可能做到。
  • 你的目标是什么?你为什么关心这个?您可以使用预计算(即消息的开头为零)吗?
  • 离题:@Mysticial 你可能对password hashing competition 感兴趣,它需要尽可能利用标准硬件(CPU+RAM)的结构,同时对其他硬件(GPU/FPGA/)不友好ASIC),所以一个重要的部分是设计和实现高性能结构。
  • 如果您控制哈希函数的输入,那么您可以使用简单的计数而不是所有的零,也许使用某种转义。例如。十六进制的000020 可能意味着 32 个零。一个(非常)基本的压缩函数可能比 MD5 或 SHA1 快得多。
  • @owlstead - 好主意 - 如果您将此作为答案提交,我会接受。

标签: c optimization cryptography md5 sha1


【解决方案1】:

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

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

【讨论】:

  • 按要求发布了解决方案,但我添加了关于使用它的“警告购买者”。希望您仍然会发现它很有用。
  • 我正在用 4K 块更新一个哈希,其中很大一部分都是零,所以这很好。每次代码看到一个“空”的 4K 块时,我可能只用一个零字节更新哈希。
  • 谢谢,零块的性能从 90M/s 提高到 500M/s。
【解决方案2】:

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

对于 SHA-1 有一个已知的加速,它具有固定的 IV 和消息,只有一点点不同。这个加速大约是 21%。见New attack makes some password cracking faster - Ars Technica

当您有一个完全固定的消息但变量 IV 时,您可能会获得类似的加速。但要实现这一点需要做很多工作,尤其是作为非专家。购买额外的硬件可能比加快代码速度要便宜很多


如果你的消息的开头包含多个常量块,你可以将它们散列一次,并缓存散列函数的中间状态。可能适用于您的情况,也可能不适用。

【讨论】:

  • SHA1 和 MD5 都不能并行化。
  • @Mysticial 不在内部/在处理单个流时。但是许多哈希性能很重要的应用程序有多个消息可以同时处理。例如同时计算不同数据包的 MAC,或同时验证多个密码猜测。
  • @Mysticial 如果你可以控制使用的算法类型,你可以使用某种tree hashing
【解决方案3】:

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

编辑:要直接回答您的问题,通过设计“密钥或明文的微小变化应该会导致密文发生巨大变化”,这意味着它在数学上很难做到意味着 .

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    相关资源
    最近更新 更多