スポンサーリンク

| キーワード:

libzipを試す(展開 , パスワード付き)

ずっと以前にパスワード付き展開を忘れていたことを思い出した。

基本は下記で、使用関数を 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);
}

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: