5

我在我的项目中使用libZip,我成功创建了 zip 文件输出,但是我很难为 zip 文件设置密码。

我正在调用zip_set_default_password 函数,我得到了 OK 响应,但是当我尝试提取它时并没有要求输入密码。

代码示例:

int CompressWithPassword(const char * psFileContent, int iFileSize, const char * pcPassword)
{
    zip_source *psZipSource = NULL;
    zip_int64_t iIndex = 0;
    int iError = EOK;
    const char * pcZipOutputPath = "/home/user/Documents/myzip.zip";

    // Open zip file.
    m_psZip =
            zip_open(pcZipOutputPath,
                    ZIP_CREATE /*Create the archive if it does not exist*/,
                    &iError);

    // Zip opend ?
    if(iError != ZIP_ER_OK)
    {
        Close();
        return iError;
    }

    // Generate zip source content.
    psZipSource =
            zip_source_buffer(m_psZip,
                              psFileContent,
                              iFileSize,
                              0);

    // Valid zip source ?
    if(psZipSource == NULL)
    {
        Close();
        iError = -1;
        return iError;
    }

    iIndex =
            zip_file_add(m_psZip,
                         pcZipOutputPath,
                         psZipSource, ZIP_FL_OVERWRITE);
    if(iIndex < 0)
    {    
        Close();
        return iIndex;
    }

    // Create password
    int iRetPassword =
                zip_set_default_password(m_psZip, pcPassword);

    // password set ?
    if (iRetPassword == -1)
    {
        Close();
        return iRetPassword;
    }

    // Close zip file.
    Close();

    return iError;
}

当我调用这个函数时,我没问题并创建了 zip 文件,我在这里缺少什么?

LibZip 版本 1.1.3-1,操作系统:fedora 25

谢谢。

4

2 回答 2

1

正如此处的 Libzip 文档中所写,如果您使用 'zip_fopen' 打开文件,'zip_set_default_password' 将“设置访问加密文件时使用的默认密码”。否则,如果您对单个文件使用不同的密码,则可以使用“zip_fopen_encrypted”打开它们。

如果要加密添加到存档的文件,则需要将“zip_file_set_encryption”与(m_psZip、iIndex、您选择的方法、pcPassword)一起使用。

于 2019-03-04T08:54:35.523 回答
1

我看到有很多人在搜索这个问题,那么我将举一个 zip_file_set_encryption 的例子,该方法基本上要求 zip 存档,文件索引,加密方法和密码:

int main(){
    int errCode = 0;
    zip *z = zip_open("package.zip",ZIP_CREATE,&errCode);

    zip_source_t *source;

    char buffer[] = "Hello world!";
    source = zip_source_buffer(z,buffer,strlen(buffer),0);
    zip_file_add(z,"example.txt",source,0);

    /* Available encryption methods: 
    ZIP_EM_AES_128
    ZIP_EM_AES_192
    ZIP_EM_AES_256
    */

    zip_file_set_encryption(z,/* Index of the file */ 0,/* Encryption method */ ZIP_EM_AES_256,/* Password to encrypt file */ "myPassword");

    zip_close(z);
};

然后当我使用 7-zip 打开我的程序创建的 zip 文件时:

7z e package.zip  

它只是提示我输入密码,如果您输入正确,那么您的工作区中的文件将被以下内容填充:

Enter password (will not be echoed):

使用 libzip 可以按名称设置文件密码,但之前有一个小过程:

int main(){
    int errCode = 0;
    zip *z = zip_open("package.zip",ZIP_CREATE,&errCode);

    zip_source_t *source;

    char buffer[] = "Hello world!";
    source = zip_source_buffer(z,buffer,strlen(buffer),0);
    zip_file_add(z,"example.txt",source,0);

    source = zip_source_buffer(z,buffer,strlen(buffer),0);
    zip_file_add(z,"example2.txt",source,0);

    // Create struct of file stat
    struct zip_stat st;

    // Fill the struct with the file name that you want
    zip_stat(z,"example2.txt",0,&st);

    // Set the password to the file using index that had got by name

    /* Available encryption methods: 
    ZIP_EM_AES_128
    ZIP_EM_AES_192
    ZIP_EM_AES_256
    */

    zip_file_set_encryption(z,/* Index of file */ st.index, /* encryption method */ ZIP_EM_AES_256, /* password */"myPassword");

    zip_close(z);
};

我正在为 libzip 创建一个包装器(尚未完成),这是一种与 zip 文件交互的简单方法,GitHub URL 在那里:https ://github.com/Romulo-Moraes/zipCrafter

注意,如果您为文件设置密码,您应该为整个 zip 文件设置相同的密码,因为当您尝试使用 7-zip 打开时会产生错误,它会尝试使用您的密码打开第一个文件然后会为整个 zip 尝试相同的密码。

一些解压程序版本会跳过你用 libzip 设置密码的文件,我推荐 7-zip

于 2022-02-07T19:13:51.523 回答