如何使用libZip给zip文件设置密码

7

我在我的项目中使用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;
}

当我调用这个函数时,我得到了“OK”,并且压缩文件已经创建,我在这里错过了什么?

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

谢谢。


1
虽然与您所问的问题无关,但是您应该知道zip文件上的密码很容易被破解 - 对吧?不要依赖它来保障真正的安全。 - Jesper Juhl
1
从函数名称和文档中可以看出,zip_set_default_password 似乎只设置加密时的默认密码,没有提到激活加密。您可能还需要调用 https://libzip.org/documentation/zip_file_set_encryption.html。 - Eelke
@Eelke,感谢您的澄清,我现在明白了zip_file_set_encryption是来自libzip 1.2版本,而我使用的是旧版1.1.3,所以我需要先更新版本,然后再进行测试,谢谢! - Simon
2个回答

2

我看到很多人在搜索这个问题,那么我将举一个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。

zip_file_add 返回刚添加的文件的索引,因此您不需要调用 zip_stat - Fedor
1
是的,谢谢您的评论,我只是想展示一种通过文件名来完成它的方法,有时比仅使用数字更易于人类阅读。 - Rômulo peres de moraes

1
如Libzip文档这里所述,'zip_set_default_password'将“设置访问加密文件时使用的默认密码”,如果您使用'zip_fopen'打开文件。否则,如果单个文件有不同的密码,则可以使用'zip_fopen_encrypted'打开它们。
如果要对添加到存档中的文件进行加密,您需要使用'zip_file_set_encryption',并提供(m_psZip,iIndex,所选方法,pcPassword)。

提供一些使用 zip_file_set_encryption 的示例将非常有帮助,因为在网络上很难找到这样的内容。 - Fedor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接