Windows C ++コンソールアプリケーションで、コマンドライン入力からパスワードを読み取りたいと思います。パスワードは暗号化に使用されます(後で復号化されます。おそらく、ロケールが異なるWindows PC上の世界の他の場所にあります)。そのため、そのパスフレーズのロケールとエンコーディングが同じ数値表現を提供しないことを心配しています。同じコンピューターまたは同じロケールのコンピューターでは、これは明らかに問題にはなりません。
したがって、固定エンコード(および正規化?)してUTF-8として格納できるようにしたいと思います。これはここで推奨されています:http ://www.jasypt.org/howtoencryptuserpasswords.html (ポイント4)。
エンコーディング/ユニコード/UTF-8/コードページに関連する多くの問題があります。私は完全には理解していません(または完全には理解していません)。私はboost:localeとboost :: nowideをいじりましたが、それを理解できなかったか、ウィンドウの下では機能しません(dunno)。関連する問題(ウィンドウ)に関するより明確なリンク:
http://alfps.wordpress.com/2011/11/22/unicode-part-1-windows-console-io-approaches/
http://alfps.wordpress.com/2011/12/08/unicode-part-2-utf-8-stream-mode/
しかし、これらのリンクは反対の問題に対処します!基礎となる表現が何であれ、物事を同じように見せるためには、どのように見えても、同じ基礎となる[ビット単位の]表現が必要です。
したがって、問題は、ロケール/エンコーディングが、8ビット整数の配列の意味でのように、暗号化される基本データ、データに影響を与えないことをどのように確認するか(そしてそうする必要があるか)です。UTF-8やUnicodeについては必ずしも気にする必要はありません。ロケールやエンコーディングに関係なく、データを回復できる必要があります。最初のリンクは、問題を説明するのに役立ちます。
CはUnicodeに対応していないと思いますが、Cコードをリンクすると役立つのでしょうか、それともC ++はそれを再び変更するのでしょうか?または、入力を「ASCII」文字(Windowsには存在しないことを知っています)に制限することは、常に「任意のWindowsコンピューター」のように機能しますか?
受け入れられた解決策:
void EncryptFileNames ( const boost::filesystem::path& p, const std::string& pw );
int main ( int argc, char **argv ) // No checking
{
// Call with encrypt.exe c:\tmp pässwörd
boost::nowide::args a ( argc, argv ); // Fix arguments - make them UTF-8
boost::filesystem::path p ( argv [ 1 ] );
EncryptFileNames ( p, boost::locale::normalize ( argv [ 2 ], boost::locale::norm_nfc, std::locale ( ) ) );
return 0;
}
すべての貢献者に感謝します。
PS:暗号化には、VS2008SP1およびBoost(ICUバックエンドなし)でCrypto++を使用します。