4

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++を使用します。

4

2 に答える 2

2

アプリケーションがでコンパイルされている場合は、UTF-8コードページを_UNICODE呼び出しWideCharToMultiByteてUTF-8を取得します。アプリケーションがでコンパイルされていない場合は_UNICODE、を呼び出しMultiByteToWideCharてACPバイトからUTF-16を取得してから、を呼び出しWideCharToMultiByteてUTF-8を取得します。

追加したコードはstd::stringを示しているため、データはおそらくシステムのACPにあります。したがって、ここのレシピは機能します。現在、この目的のために、などの便利なAPIがたくさんありますmbtowcs。「MB」に気を取られないでください。これは単なるWindowsです。「UTF-16ではなく」を意味します。

于 2012-09-08T12:52:59.443 に答える
-4

まず、UTF-8は赤いニシンです。国際的であるためには、国際的な文字セットを使用する必要があります。検討する価値のある文字セットは1つだけで、Unicodeと呼ばれます。プログラム内でUnicodeをどのように表現するか(つまり、どのようにエンコードするか)は、エンコードがすべてのUnicodeを表現できる限り、問題はありません。UTF-8を選択することもできますが、Windowsで作業しているため、Windowsが内部で使用するエンコードであるUTF-16を選択するのが妥当と思われます。bmarguliesが言うように、MultiByteToWideCharを使用して、ローカル表現(つまり、ローカルコードページ)からUTF-16に移動できます。追加の手順を実行してUTF-16からUTF-8を生成する必要はないと思いますが、それを実行したい場合は、WideCharToMultiByteを使用できます。

于 2012-09-08T13:43:06.443 に答える