【问题标题】:How to create minimum size (empty) zip file, which has 22B?如何创建具有 22B 的最小大小(空)zip 文件?
【发布时间】:2015-03-24 14:13:41
【问题描述】:

我正在尝试解决文件的一些安全问题,其 MD5 哈希为 76cdb2bad9582d23c1f6f4d868218d6c。

我没有那个文件,但根据互联网 MD5 搜索,我认为它是最小大小的 zip 文件。 我找到了一个example,它的内容和minimum size zip file一模一样。

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

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

【问题讨论】:

    标签: linux windows compression zip


    【解决方案1】:

    给你:

    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 文件中删除,使其为空。

    【讨论】:

    • 可以说,直接将字节回显到文件是一种更简单的创建方法: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
    • 为我匹配。可能取决于你的外壳。
    • @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
    【解决方案2】:

    一个更易于使用的复制粘贴到 shell 的版本:

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

    这只是打印空 zip 文件的 base64'd 版本(通过使用单个文件创建 zip 文件然后从 zip 文件中删除该单个文件来创建),并使用 base64 -d 反转编码并写入输出到empty.zip


    如果您的机器附带的 base64 版本不使用与上述相同的语法,这里有一个更便携但不太简洁的替代方案:

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

    【讨论】:

    • 我必须在我的系统上使用-D 而不是-d。您可以使用 echo -n 来避免换行,但您不需要这样做。只需使用echobase64 不关心换行符。
    • @MarkAdler 谢谢。 echo -n 不可移植,但我完全忘记了 base64 不关心行尾。我不确定什么是最便携的 base64 解码方式,可能是通过openssl,但我认为这在 macOS 上不再可用 oob。
    • 我有最新的 macOS,还有来自 LibreSSL 2.2.7 的 openssl 命令。它也有base64。
    • 谢谢,@MarkAdler;在答案中添加了一个基于 openssl 的变体。
    【解决方案3】:

    使用 Info-Zip(Ubuntu 20.04 上的标准 zip/unzip 安装),您必须使用 -i "*" 选项。如果它不存在,zip 将在创建时抱怨并退出,并返回错误代码 1。与直觉相反,它的行为随着-i "*" 而变化。

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

    mytest.zip 将是您想要的空 zip 文件。

    【讨论】:

      【解决方案4】:

      使用这个.bat 脚本,您可以在windows 下创建empty.zip 文件:

      @echo off
      
      del /q /f empty.zip >nul 2>nul
      certutil -decode "%~f0" empty.zip
      
      -----BEGIN CERTIFICATE-----
      UEsFBgAAAAAAAAAAAAAAAAAAAAAAAA==
      -----END CERTIFICATE-----
      

      【讨论】:

        【解决方案5】:

        tldr;

        使用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
        

        注意zipinfo 在给定结果empty.zip 时如何返回错误:

        $ 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==
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-09
          • 2012-05-19
          • 2015-10-12
          • 1970-01-01
          相关资源
          最近更新 更多