🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1486閲覧

復号したバイト列をwstring型に変換したい

reu

総合スコア5

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/09/08 03:59

前提・実現したいこと

復号したバイト列を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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

[TIPS]String型とbyte配列の相互変換

参考になるでしょうか

投稿2019/09/08 04:06

y_waiwai

総合スコア88040

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reu

2019/09/08 05:27

回答ありがとうございます。このサイトを参考にしましたら、自分の方法のようにコンストラクタを使ってるようでした。ただ、sizeの指定部分が違ったので直してみたら文字化けが治りました! ありがとうございます。 std::wstring Convvv(reinterpret_cast<wchar_t const*>(outdata), outdata1_len / sizeof(wchar_t)); // wchar_tのサイズで割ってなかった
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問