前提・実現したいこと
復号したバイト列をwstring型に変換したい
発生している問題・エラーメッセージ
outdata に復号したデータが入っているのですが、直接wstring 型に変換すると文字化けしてしまい困っています。
暗号化したファイルを復号してからwstring型でメモリに乗せたいと思っています。
いったん復号したファイルに保存してから、開いた場合は文字化けしないので復号は成功しています
unsigned char から直接wstringに変換したいです。
復号したデータをいったん保存し、以下の開き方をしたら文字化けはしていません。
std::wifstream IFS(Path, std::ios::binary);
IFS.imbue(std::locale(IFS.getloc(),
new std::codecvt_utf16<wchar_t, 0x10ffff, std::consume_header>));
該当のソースコード
C++
1void decrypt(const wchar_t* ifile) 2{ 3 struct _stat64i32 ifile_stat; 4 if (0 == _wstat(ifile, &ifile_stat)) 5 { 6 FILE* i_file; 7 _wfopen_s(&i_file, ifile, L"rb"); 8 9 unsigned char salt_key[PKCS5_SALT_LEN]; 10 unsigned char salt[16]; 11 12 // salt読み込み 13 fread(salt, sizeof(char), 16, i_file); 14 for (int i = 0; i < PKCS5_SALT_LEN; i++) 15 { 16 salt_key[i] = salt[i + PKCS5_SALT_LEN]; 17 } 18 19 int outdata1_len = 0; 20 int outdata2_len = 0; 21 22 unsigned char *indata = (unsigned char *)malloc(ifile_stat.st_size); 23 unsigned char *outdata = (unsigned char *)malloc(ifile_stat.st_size); 24 unsigned char key[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH]; 25 26 // データ読み込み 27 fread(indata, sizeof(char), ifile_stat.st_size, i_file); 28 29 const EVP_CIPHER* ci = EVP_aes_256_cbc(); 30 EVP_BytesToKey(ci, EVP_md5(), salt_key, password, 31 strlen((const char *)password), 1, key, iv); 32 33 EVP_CIPHER_CTX ctx; 34 EVP_DecryptInit(&ctx, ci, key, iv); 35 EVP_DecryptUpdate(&ctx, outdata, &outdata1_len, indata, 36 ifile_stat.st_size); 37 EVP_DecryptFinal(&ctx, outdata + outdata1_len, &outdata2_len); 38 EVP_CIPHER_CTX_cleanup(&ctx); 39 40 41 std::wstring Convvv(reinterpret_cast<wchar_t const*>(outdata), 42 outdata1_len - (int)outdata[ifile_stat.st_size - 16 - 1]); 43 44 std::wcout << "@@@" << Convvv << std::endl; // 文字化け 45 46 FILE* o_file; 47 _wfopen_s(&o_file, ofile, L"wb"); 48 // padding部分を削って書き込む。書き込みデータの一番最後のデータから削る分を特定する。 49 fwrite(outdata, sizeof(char), 50 outdata1_len - (int)outdata[ifile_stat.st_size - 16 - 1], 51 o_file); 52 53 fclose(i_file); 54 fclose(o_file); 55 56 free(indata); 57 free(outdata); 58 indata = NULL; 59 outdata = NULL; 60}
試したこと
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/08 05:27