ずっと以前にパスワード付き展開を忘れていたことを思い出した。
基本は下記で、使用関数を zip_fopen_encrypted にする。
#include <zip.h> #include <iostream> #pragma comment(lib,"zip.lib") #pragma warning(disable:4996) void compress_encrypted(); void uncompress_encrypted(); //ファイルを圧縮 int main(int argc, char* argv[]) { //compress_encrypted(); uncompress_encrypted(); int i; std::cin >> i; return 0; }
void uncompress_encrypted() { // パスワードの定義 const char* thePassWord = "j6KY4cwC"; // ZIPファイルを読み取り専用で開く int errorp; zip_t* zipper = zip_open(R"(C:\test\out.zip)", ZIP_RDONLY, &errorp); // ZIP内のファイルの個数を取得 zip_int64_t num_entries = zip_get_num_entries(zipper, 0); // ZIP内のファイルの各ファイル名を取得 std::cout << "count: " << num_entries << std::endl; for (zip_int64_t index = 0; index < num_entries; index++) { std::cout << "[" << index << "]" << zip_get_name(zipper, index, ZIP_FL_ENC_RAW) << std::endl; } // ZIP内の2番目のファイルに関する情報を取得する struct zip_stat sb; zip_int64_t index = 2; zip_stat_index(zipper, index, 0, &sb); // 2番目のファイルのファイルサイズと同じメモリを確保する char* contents = new char[sb.size]; // 2番目のファイルの内容をメモリに読み込む zip_file* zf = zip_fopen_encrypted(zipper, sb.name, 0, thePassWord); zip_fread(zf, contents, sb.size); zip_fclose(zf); zip_close(zipper); ////////////////// // ファイル名を出力できる形に変更 // ファイル一覧は階層構造をしておらず、ディレクトリ区切りは'/'で直接出力できないので // ファイル名中の'/'を'-'に置き換える。 // 本来なら再帰的にディレクトリを作るなどすべき。 std::string target = sb.name; for (size_t i = 0; i < target.size(); i++) { if (target[i] == '/') { target[i] = '-'; } } // ////////////////// // 解凍したファイルを作成 std::string outname = R"(C:\test\)" + target; FILE* of = fopen(outname.c_str(), "wb"); fwrite(contents, 1, sb.size, of); fclose(of); }
void compress_encrypted() { int errorp; zip_t* zipper = zip_open(R"(C:\test\out.zip)", ZIP_CREATE | ZIP_EXCL, &errorp); // パスワードの定義 const char* thePassWord = "j6KY4cwC"; zip_source_t* source; zip_int64_t iIndex; source = zip_source_file(zipper, R"(C:\test\data\snail1.png)", 0, 0); iIndex = zip_file_add(zipper, R"(snail1.png)", source, ZIP_FL_ENC_RAW); zip_file_set_encryption(zipper, iIndex, ZIP_EM_AES_128, thePassWord);//パスワードを指定 source = zip_source_file(zipper, R"(C:\test\data\snail2.png)", 0, 0); iIndex = zip_file_add(zipper, R"(snail2.png)", source, ZIP_FL_ENC_RAW); zip_file_set_encryption(zipper, iIndex, ZIP_EM_AES_128, thePassWord);//パスワードを指定 source = zip_source_file(zipper, R"(C:\test\data\snail5.png)", 0, 0); iIndex = zip_file_add(zipper, R"(snail5.png)", source, ZIP_FL_ENC_RAW); zip_file_set_encryption(zipper, iIndex, ZIP_EM_AES_128, thePassWord);//パスワードを指定 zip_close(zipper); }