无法打开受密码保护的 zip 存档

Posted

技术标签:

【中文标题】无法打开受密码保护的 zip 存档【英文标题】:Could not open password protected zip archive 【发布时间】:2020-05-20 08:10:30 【问题描述】:

我正在使用 php 7.4(lib-zip 版本 1.6.1)创建一个 zip 存档,没有任何问题。

现在我尝试使用密码保护这些 zip 存档。不仅用于使用 php 加密,而且通常用于加密。我找到了这个tutorial。它做了它应该做的,但我无法再读取 zip 存档的文件了。如果我双击存档,将打开密码提示,但它不适用于源代码中的密码。我还复制并粘贴了它以防止任何键盘问题。

<?php

$zip = new ZipArchive();
$filePath = sprintf('%s/test/', __DIR__);
$fileName = 'test.zip';
$absoluteFilePath = $filePath . $fileName;
$excludeFolderNames = [
  '.',
  '..',
  '.DS_Store',
  $fileName,
];

$zipFlag = ZipArchive::CREATE;
if (file_exists($absoluteFilePath)) 
    $zipFlag = ZipArchive::OVERWRITE;


$createFile = $zip->open($absoluteFilePath, $zipFlag);
if (true !== $createFile) 
    throw new RuntimeException(sprintf('could not open file in "%s" caused by %s', $fileName, $createFile));


$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($filePath));
$password = 'top-secret';
if (!$zip->setPassword($password)) 
    throw new RuntimeException('Set password failed');


/** @var SplFileInfo $value */
foreach ($iterator as $key => $value) 
    if (in_array($value->getFilename(), $excludeFolderNames)) 
        continue;
    

    $cleanFilePath = realpath($key);
    if (!$cleanFilePath) 
        throw new RuntimeException(sprintf('could not create real path from filepath: %s', $key));
    

    $zipName = str_replace($filePath, '', $cleanFilePath);
    if (!$zip->addFile($cleanFilePath, $zipName)) 
        throw new RuntimeException(sprintf('Add file failed: %s', $cleanFilePath));
    

    if (!$zip->setEncryptionName($zipName, ZipArchive::EM_AES_256)) 
        throw new RuntimeException(sprintf('Set encryption failed: %s', $zipName));
    


$zip->close();

有人有同样的问题还是我有问题?

更新一: 我认为它解决了我的问题,将 zip 文件保存在我要压缩的文件夹之外。所以我更改了以下行:

$absoluteFilePath = sprintf('%s/%s', __DIR__, $fileName);

过了一会儿,错误又出现了。

我发现的一个可能原因是 .DS_Store 文件。在我的示例中,我将它们排除在外。但是错误又出现了。

更新二: 另一个问题是,如果所有文件都是空的,则没有密码提示。

更新三: 相同的代码适用于没有换行符的文件,但如果文件有多行,则会发生错误。

【问题讨论】:

用最小的例子发布你的代码。 是的。我还得到“不支持的压缩方法 99”。这对我来说没有任何理由,因为它可以工作,如果文件中只有一行,无论是否有特殊字符。但是只有命令行它永远不会起作用。 【参考方案1】:

我在php-bugtracker 找到了帮助。事实证明,我可以使用 zip-extension 提取所有文件,就像 cmets 之前试图告诉我的那样。现在我等待新的libzip 版本 1.7.0,其中默认的 zip 加密可用。在此之后,我希望我可以在没有任何扩展名的情况下提取我的文件。

【讨论】:

以上是关于无法打开受密码保护的 zip 存档的主要内容,如果未能解决你的问题,请参考以下文章

在 Powershell 中查找受密码保护的 .ZIP 文件

在 dotnet core 中打开和编辑受密码保护的 zip

Delphi JEDI JCL JclCompression:检测受密码保护的存档

如何使用 c# 以写入模式打开受密码保护的 Zip 文件?

如何在 Java 中使用 truezip 库打开受密码保护的 zip 文件

如何检查文件是不是通过 7zip 受密码保护?