如何在PHP中检查加密的Zip存档文件?

如何在PHP中检查加密的Zip存档文件?,php,encryption,zip,zipfile,ziparchive,Php,Encryption,Zip,Zipfile,Ziparchive,据我所知,状态为存档加密,包含通用位标志。我试图用ZipArchive::statname()检查这一点,但似乎无法通过此方法获取信息 我还能做什么?读取归档文件并解析标题?我知道我可以调用system(),但我不想使用此方法,因为它的特殊性(承载此函数的某些函数已被禁用)。ZIP文件头:(加密文件与普通文件) 09请参见MTS作为加密标志 检查第7字节是否为0x09 function zip_is_encrypted($filename) { $handle = fopen($filen

据我所知,状态为存档加密,包含通用位标志。我试图用ZipArchive::statname()检查这一点,但似乎无法通过此方法获取信息

我还能做什么?读取归档文件并解析标题?我知道我可以调用system(),但我不想使用此方法,因为它的特殊性(承载此函数的某些函数已被禁用)。

ZIP文件头:(加密文件与普通文件)

09
请参见MTS作为加密标志

检查第7字节是否为
0x09

function zip_is_encrypted($filename) {
  $handle = fopen($filename, "rb");
  $contents = fread($handle, 7);
  fclose($handle);
  return $contents[6] == 0x09;
}
以下是ZIP标准:

根据第4.3.7节:

4.3.7  Local file header:

  local file header signature     4 bytes  (0x04034b50)
  version needed to extract       2 bytes
  general purpose bit flag        2 bytes
  compression method              2 bytes
  ...
根据第4.4.4节:

4.4.4 general purpose bit flag: (2 bytes)

    Bit 0: If set, indicates that the file is encrypted.
    ...

因此,您需要检查第七个字节的第一位,而不是整个字节。您必须对每个文件进行检查,因为每个文件都可以单独加密(第4.3.6节)。

这不起作用,因为标头可以重复n次

要解决此问题,请打开zip-zip\u-open()并尝试读取每个条目zip\u-entry\u-open()


如果存在无法读取的条目,则可以对zip进行加密

你用ZipArchive::statname做了哪些尝试?你收到错误信息了吗?请提供更多信息。ZipArchive打开了加密文件,但提供的信息不足。方法
ZipArchive::statidex()
的返回值的一个参数。我试图通过
comp_方法
识别加密档案,但没有发现任何依赖关系。Ticksy我甚至为您提供了一个简单的函数+1,引用了一些官方文件,指定了位nice@owlstead . 关于加密:
4.4.4通用位标志:(2字节)位0:如果设置,则表示文件已加密。
@owlstead您需要检查第七字节的第一位。Peter answer不起作用。不同的zip应用程序在文件顶部放置不同的信息。例如,带有密码的izarc4.3zip文件的第7字节将有一个03值,如果没有密码保护,则有一个02值。