Начиная с версии php 7.2 (выпущенной несколько часов назад), правильный способ сделать это - использовать дополнительные функции, включенные в ZipArchive собственный код php. (спасибо abraham-tugalov за указание на то, что это изменение грядет)
Теперь простой ответ выглядит примерно так:
<?php
$zip = new ZipArchive();
if ($zip->open('test.zip', ZipArchive::CREATE) === TRUE) {
$zip->setPassword('secret_used_as_default_for_all_files'); //set default password
$zip->addFile('thing1.txt'); //add file
$zip->setEncryptionName('thing1.txt', ZipArchive::EM_AES_256); //encrypt it
$zip->addFile('thing2.txt'); //add file
$zip->setEncryptionName('thing2.txt', ZipArchive::EM_AES_256); //encrypt it
$zip->close();
echo "Added thing1 and thing2 with the same password\n";
} else {
echo "KO\n";
}
?>
Но вы также можете установить метод шифрования по индексу, а не по имени, и вы можете установить каждый пароль для каждого файла отдельно ... а также указать более слабые параметры шифрования, используя недавно поддерживаемые параметры шифрования .
В этом примере представлены более сложные варианты.
<?php
$zip = new ZipArchive();
if ($zip->open('test.zip', ZipArchive::CREATE) === TRUE) {
//being here means that we were able to create the file..
//setting this means that we do not need to pass in a password to every file, this will be the default
$zip->addFile('thing3.txt');
//$zip->setEncryptionName('thing3.txt', ZipArchive::EM_AES_128);
//$zip->setEncryptionName('thing3.txt', ZipArchive::EM_AES_192);
//you should just use ZipArchive::EM_AES_256 unless you have super-good reason why not.
$zip->setEncryptionName('thing3.txt', ZipArchive::EM_AES_256, 'password_for_thing3');
$zip->addFile('thing4.txt');
//or you can also use the index (starting at 0) of the file...
//which means the following line should do the same thing...
//but just referencing the text.txt by index instead of name..
//$zip->setEncryptionIndex(1, ZipArchive::EM_AES_256, 'password_for_thing_4'); //encrypt thing4, using its index instead of its name...
$zip->close();
echo "Added thing3 and thing4 with two different passwords\n";
} else {
echo "KO\n";
}
?>
Базовая поддержка zip-шифрования включена, поскольку в libzip 1.2.0 появилась поддержка шифрования. Таким образом, вам понадобится php 7.2 и libzip 7.2, чтобы запустить этот код ... Надеюсь, эта заметка будет искажена этим ответом "очень скоро"