在 Windows C++ 控制台应用程序中,我想从命令行输入中读取密码。密码用于加密(以及以后的解密,可能在世界其他地方的 Windows pc 上具有不同的语言环境)。所以我担心该密码的语言环境和编码没有给出相同的数字表示。在同一台计算机或具有相同语言环境的计算机上,这显然不会产生问题。
因此,我希望能够固定编码(和规范化?)并存储为 UTF-8。此处推荐:http ://www.jasypt.org/howtoencryptuserpasswords.html (第 4 点)。
有很多与编码/unicode/UTF-8/codepages 相关的问题我没有完全(或完全没有)掌握。我摆弄了 boost:locale 和 boost::nowide,但无法弄清楚或者它在 Windows 下不起作用(不知道)。一些链接对所涉及的问题(窗口)进行了更多说明:
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/
但是这些链接解决了相反的问题!无论底层表示如何,如何使事物看起来相同,我需要相同的底层 [bit-wise] 表示,无论它看起来如何!
所以问题是,我如何确保(我必须这样做吗?)语言环境/编码对加密的基本数据(数据)没有影响,就像 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++。