如何创建大小为22B的最小空zip文件?

26

我试图解决一个文件的安全问题,该文件的MD5哈希值为76cdb2bad9582d23c1f6f4d868218d6c。

虽然我没有那个文件,但是根据互联网上的MD5搜索结果,我认为它是最小尺寸的zip文件。 我找到了一个示例,其内容与最小尺寸的zip文件完全相同。

是否可以使用Linux(或Windows)命令创建这样的最小尺寸zip文件(22 B)?

顺便提一下,最近我用gzip文件解决了类似的任务:gzip -n EmptyFileName

5个回答

51

这是您需要的内容:

50 4b 05 06 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00

这具有您提供的MD5签名。

如果您使用Info-ZIP的zip,可以按照以下方式创建它:

zip empty.zip anyfile
zip -d empty.zip anyfile

这将"anyfile"添加到一个新的zip文件中,然后从zip文件中删除它,使其变为空。


4
可以说,将字节直接复制到文件中是一种更简单的创建方法:echo -n '\x50\x4b\x05\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' > empty.zip - Yona Appletree
2
@MahmoudAl-Qudsi 它适用于zsh。对于bash或sh,您必须添加“-e”选项:echo -ne '\x50\x4b\x05\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' > empty.zip - Tom Cornebize

12

更易于使用的版本,可复制并粘贴到shell中:

echo UEsFBgAAAAAAAAAAAAAAAAAAAAAAAA== | base64 -d > empty.zip

这段代码将打印空zip文件的base64编码版本(通过创建包含单个文件的zip文件,然后从zip文件中删除该单个文件而创建),并使用base64 -d解码并将输出写入empty.zip


如果您的计算机上内置的base64版本与上述语法不同,则可以使用以下更可移植但不太简洁的替代方法:

echo UEsFBgAAAAAAAAAAAAAAAAAAAAAAAA==  | openssl enc -d -base64 > empty.zip

我在我的系统上必须使用-D而不是-d。你可以使用echo -n来避免换行符,但你不需要这样做,直接使用 echo 命令即可。base64 不会关心换行符。 - Mark Adler
@MarkAdler 谢谢。echo -n 不是可移植的,但我完全忘记了 base64 不关心行结尾符。我不确定最可移植的进行 base64 解码的方式是什么,也许可以通过 openssl,但我认为在 macOS 上它不再是 oob 可用的。 - Mahmoud Al-Qudsi
我有最新的macOS,其中包含LibreSSL 2.2.7的openssl命令和base64。 - Mark Adler
谢谢,@MarkAdler;我在答案中添加了一个基于openssl的变体。 - Mahmoud Al-Qudsi

4

使用在Ubuntu 20.04上的标准zip/unzip安装程序Info-Zip,需要使用-i "*"选项。如果没有此选项,zip将会抱怨并在创建时退出错误代码1。与直觉相反,它的行为会随着-i "*"的变化而改变。

mkdir /tmp/mytest
cd /tmp/mytest
zip -r mytest.zip . -i "*"

mytest.zip 将是你所需的空 ZIP 文件。


1
使用这个 .bat 脚本,你可以在Windows下创建一个 empty.zip 文件。
@echo off

del /q /f empty.zip >nul 2>nul
certutil -decode "%~f0" empty.zip

-----BEGIN CERTIFICATE-----
UEsFBgAAAAAAAAAAAAAAAAAAAAAAAA==
-----END CERTIFICATE-----

0

简而言之;

使用printf

$ printf '\x50\x4b\x05\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >empty.zip
$ md5sum empty.zip 
76cdb2bad9582d23c1f6f4d868218d6c  empty.zip

使用base64

$ base64 -d >empty.zip <<'EOF'
UEsFBgAAAAAAAAAAAAAAAAAAAAAAAA==
EOF
$ md5sum empty.zip
76cdb2bad9582d23c1f6f4d868218d6c  empty.zip

说明

zip 工具不支持创建空的 zip 文件,但是你可以创建一个非空的 zip 文件,然后删除其中的内容:

$ touch foo.txt
$ zip empty.zip foo.txt
  adding: foo.txt (stored 0%)
$ zip -d empty.zip foo.txt
deleting: foo.txt
    zip warning: zip file empty

请注意,当给出结果为empty.zip时,zipinfo会返回一个错误:
$ zipinfo empty.zip 
Archive:  empty.zip
Zip file size: 22 bytes, number of entries: 0
Empty zipfile.
$ echo $?
1

你可以确认empty.zip的字节是否符合预期:

$ file empty.zip
empty.zip: Zip archive data (empty)
$ xxd empty.zip
00000000: 504b 0506 0000 0000 0000 0000 0000 0000  PK..............
00000010: 0000 0000 0000                           ......

你可以使用 printf 直接将这 22 字节(以十六进制表示)写入文件:
$ printf '\x50\x4b\x05\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >empty.zip

你也可以将这22个字节转换为32个base64编码字符并使用它:

$ base64 <empty.zip 
UEsFBgAAAAAAAAAAAAAAAAAAAAAAAA==

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