暗号化した文字を無事サーバに届けるには、char byte WCHAR間の変換のが必要で、整理してみた。
ネット上では標準になっているUTF8を使用するとして、暗号化した文字を送ると以下になる。


○Client(C++)->Server(C#)

元のデータ(WCHAR)-->EncodeToUtf8(UTF8)->暗号化(BYTE)->ATL::Base64Encode(char)->EscapeEncode(char)->Wininet(C++)->[client PC]->[internet]->

  • >[server PC]->C# Request(EscapeDecode string)->Convert.FromBase64String(BYTE)->復号化(BYTE)->Encoding.UTF8.GetString(string)-->元のデータ


C++アプリでは既にWCHARのUnicodeが普通になっている。これをUTF8に変換する。WideCharToAsciiという名前と機能が一致しないAPIを使う。返るcharをbyteにキャストして暗号化処理。バイナリデータなので、Base64Encodeで再び文字に変換する。
Base64に変換された文字は英数字と'+','/','='だけで構成されていている。'+'の文字は空白を意味するのでさらにEscapeEncode後、Wininetに送り込む。

サーバ側はRequest内でEscapeDecodeされ、その文字をバイナリへ戻し暗号を復号化後はUTF8をWCHARに組み立て直す。C#のstringの内部はWCHAR。

逆の経路は以下。


○Server(C#)->Client(C++)

元のデータ(string)-->Encoding.UTF8.GetBytes(BYTE)->暗号化(BYTE)->Convert.ToBase64String->C# Response.Write ->[server PC]->[internet]->

  • >[clinet PC]->Wininet(C++)->ATL::Base64Decode->復号化(BYTE)->Utf8ToDecode-->元のデータ

HTTPSが使えない場合か使いたくない場合は、こんなふうになります。