如何制作Zip炸弹?

148

这个问题关于zip炸弹自然而然地引导我去了维基百科页面。该文章提到了一个45.1 kb的zip文件的例子,解压后大小为1.3 exabytes。

首先用到的是哪些原理/技术呢?我并不想真的去做这件事,更感兴趣的是对所涉及概念的简化的“工作原理”解释。

文章提到了9层zip文件,因此这不是简单地将一堆零压缩在一起的情况。为什么是9层,每层为什么要有10个文件?


5
@Michael你的抱怨是无效的。虽然OP询问了它是如何工作的,但是文章中没有任何内容说明它是为了禁用防病毒软件而设计的。相反,文章的重点似乎是一种DOS风格的攻击,只是顺带提到了禁用防病毒软件。 - San Jacinto
2
重点是,OP指的是一个特定的文件,它由嵌套的存档组成,而不是一个巨大的压缩文件。 - Michael Borgwardt
1
我认为迈克尔是正确的,他解释了如何创建“PS”中描述的文件,而其他人没有。然而,“PS”是作为编辑添加的,因此那些答案在给出时可能并不明显错误。他们只是认为“这样的文件”意味着“任何解压到1.3 exabytes的文件”,而事实证明它的意图是“一个像我链接文章中描述的文件结构”。 - Steve Jessop
1
@onebyone 我完全同意。我只是认为在这种情况下不应该使用负评。 - San Jacinto
4
我猜这取决于你认为downvote的含义是“这不是回答问题的最佳答案”还是“你是个傻瓜,不值得活着”,或者介于两者之间。就我个人而言,我认为downvote意味着我应该重新阅读我的答案,看看是否有明显的错误需要修正。但是,如果我认为我的答案有所贡献,我现在非常乐意接受反对意见而不改变我的答案。而且我已经对整个投票过程变得相当不关心,因为很明显我永远无法赶上Jon Skeet;-) - Steve Jessop
显示剩余8条评论
15个回答

2
也许,在Unix上,您可以将一定量的零直接传输到zip程序或其他程序中?不过我对Unix了解不够,无法解释如何做。除此之外,您需要有一个零的来源,并将其传输到从stdin读取的压缩器中。

因为忽略了实际问题,被点踩了。实际问题中提到了一个特定的文件,明确说明它不是将一大串零压缩而成的结果。 - Michael Borgwardt
不,你仍然会受到计算能力的限制。理想情况下,你不希望运行gzip/zip,因为它会使用大量CPU(或至少是O(n),n是解压缩文件的大小)。 - tonfa
@tonfa:当然,你会受到计算能力的限制。我的想法是,你可能不想在你的磁盘上创建一个百亿字节大小的文件,然后再压缩它... - Svish

2
所有文件压缩算法都依赖于待压缩信息的熵。理论上,您可以压缩一串0或1的流,如果足够长,它将非常压缩。
这是理论部分。实际部分已经被其他人指出。

2
我试过了,输出的zip文件大小只有84KB。
我所做的步骤如下:
1.创建一个1.4GB的.txt文件,里面全是'0'。
2.压缩它。
3.将.zip重命名为.txt,然后复制16份。
4.将所有内容压缩成一个.zip文件。
5.将.zip文件中重命名的.txt文件再次重命名为.zip。
6.重复步骤3到5,共8次。
7.享受:)
虽然我不知道如何解释重命名后的压缩文件仍然能够压缩到更小的尺寸,但这确实有效。也许我只是缺乏技术术语。

1
顺便说一句,不要担心它会持续提取其中所有的 zip 文件。它只会提取嵌套在其中的 zip 文件,而不是一直提取到底层。 - jaycroll

2

近年来(1995年以后),像bz2、lzma(7-zip)和rar这样的压缩算法可以对单调文件进行惊人的压缩,而一层压缩就足以将超大的内容包装成可管理的大小。

另一种方法是创建一个极大尺寸(exabytes)的稀疏文件,然后使用一些理解稀疏文件的普通压缩工具(例如tar)进行压缩,现在如果检查员流式传输文件,检查员需要读取所有这些零,这些零仅存在于文件实际内容之间的填充中,但是如果检查员将其写入磁盘,假设压缩解包工具行为良好并且使用现代文件系统,则只会占用很少的空间。


1

我不知道ZIP是否使用了游程编码,但如果使用了,这样一个压缩文件将包含一小段数据和非常大的游程值。游程值将指定小数据片段被重复多少次。当你有一个非常大的值时,结果数据就会相应地变得很大。


2
ZIP使用Lempel-Ziv-Welch(或其修改版本)压缩算法,有效地将数据进行标记化处理。长时间运行的字节“集合”将导致良好的压缩效果,因此GIF(也使用LZW)适用于图形,而JPEG(使用复杂的正弦波压缩)则更适用于照片,因为数据更加“随机”。 - Lazarus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接