【问题标题】:Are there algorithms for putting a digest into the file being digested?是否有将摘要放入被摘要文件的算法?
【发布时间】:2010-02-03 17:36:47
【问题描述】:

是否有将摘要放入被摘要文件的算法?

换句话说,是否有算法或库,或者是否有可能对包含在被散列/摘要的文件中的文件进行散列/摘要。出于显而易见的原因,这将很方便,例如内置 ISO 的摘要。我试过用谷歌搜索“MD5 注入”和“文件中的文件摘要”之类的东西。没有运气(可能是有充分理由的。)

不确定它是否在数学上是可能的。似乎您可以滚动浏览文件,但是您必须对最后一点进行暴力破解(假设摘要是文件或对象中的最后一件事。)

谢谢, 陈兹

【问题讨论】:

  • 你说Catch 22

标签: md5 sha1 checksum digest


【解决方案1】:

在有限的意义上是可能的:

非加密安全哈希

您可以使用 CRC 校验和系列等不安全的散列来做到这一点。

麦克林gzipquine

Caspian Maclean created a gzip quine,它会自行解压。由于未压缩数据的Gzip格式includes a CRC-32 checksum (see the spec here),并且未压缩数据等于文件本身,因此该文件包含自己的哈希。所以这是可能的,但是 Maclean 没有指定他用来生成它的算法:

理论上很简单,但是我使用的帮助程序在一个发生故障的硬盘上,我还没有设置一个新的工作 linux 系统来运行它们。尤其是手动求解校验和会非常乏味。

Cox 的 gziptar.gz 和 ZIP quines

Russ Cox created 3 more quines in Gzip, tar.gz, and ZIP formats,并在一篇出色的文章中详细描述了他是如何创建它们的。这篇文章介绍了他如何嵌入校验和:蛮力——

第二个障碍是 zip 存档(和 gzip 文件)记录未压缩数据的 CRC32 校验和。由于未压缩的数据是 zip 存档,因此校验和的数据包括校验和本身。所以我们需要找到一个值 x,这样将 x 写入校验和字段会导致文件校验和到 x。递归反击。

CRC32 校验和计算将整个文件解释为一个大数字,并在您使用特定除法将该数字除以特定常数时计算余数。我们可以努力建立适当的方程并求解 x。但坦率地说,我们今天已经解决了一个令人讨厌的递归难题,足够了。 x 只有 40 亿种可能性:我们可以编写一个程序依次尝试每种可能性,直到找到一个可行的方法。

他还提供the code that generated the files

(另见Zip-file that contains nothing but itself?

加密安全摘要

使用加密安全的散列函数,如果不破坏散列函数(特别是安全摘要应该使其“无法生成具有给定散列的消息”)或应用蛮力,这应该是不可能的.

但是这些哈希值比 32 位长得多,正是为了阻止这种攻击。所以你可以写一个蛮力算法来做到这一点,但unless you're extremely lucky你不应该期望它在宇宙结束之前完成。

MD5 坏了,所以可能更容易

MD5 算法被严重破坏,选择前缀冲突攻击已经可行(如在 Flame 恶意软件的伪造证书中使用的那样;参见 http://www.cwi.nl/news/2012/cwi-cryptanalist-discovers-new-cryptographic-attack-variant-in-flame-spy-malwarehttp://arstechnica.com/security/2012/06/flame-crypto-breakthrough/)。我不知道你实际上想要做什么,但很有可能它是可能的。这可能是一个开放的研究问题。

例如,这可以使用选择前缀原像攻击来完成,选择等于所需哈希的前缀,以便将哈希嵌入文件中。一种 原像攻击比碰撞攻击更难,但已经取得了一些进展。见Does any published research indicate that preimage attacks on MD5 are imminent?

也可以find a fixed point for MD5;插入摘要本质上是相同的问题。讨论请见md5sum a file that contain the sum itself?

相关问题:

【讨论】:

    【解决方案2】:

    这样做的唯一方法是,如果您定义文件格式,以便哈希仅适用于不包含哈希的文件部分。

    但是,在文件中包含哈希(就像内置在 ISO 中一样)会破坏哈希的整体安全优势。您需要从不同的通道获取哈希并将其与您的文件进行比较。

    【讨论】:

      【解决方案3】:

      不,因为这意味着散列必须是自身的散列,这是不可能的。

      【讨论】:

      • 嗯...可能,但不划算,因为您必须以某种方式破坏它。
      • 如果不依赖于发现碰撞,我看不到这是怎么可能的,但也许这就是你所说的暴力破解的意思?找到 hash(data+hash) 和 hash(hash) 给出相同输出的场景?
      • @kb:是的,这是可能的,就像你说的那样。 for (x=0; x160; x++) {if SHA1(data || x) == x {print "Success" + x; break} } if (x==2160) {print "Failure")} 很傻吧?
      • 哈哈,好吧,那我就更正了。感谢您不投票。 ^__^
      • 哈哈,两年半后,居然有人费力地否决了这个。我印象深刻。
      猜你喜欢
      • 1970-01-01
      • 2020-10-25
      • 2010-12-13
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 2012-03-12
      相关资源
      最近更新 更多