2014-12-27 162 views
0

把亚洲和其他字符我已经加密了大量的文字,导致此:在Visual Studio中的源代码

const char* encrypted[] = { 
"ꖟ럵꼹ᐦෑ䵖","ꗹモ拧ᔞ诞凲ḏ","᜷瞗긚⧿숯塚","輶䖙挿斃ぁ忋","掂䉧딻䠕᭖嬽핹ճ","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","ㄿ爛泰먅轭➊㻎⌧","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋", 
"욊蚘坸ꭤ䱤㇔鸽","욊蚘坸ꭤ䱤㇔鸽","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","䀴♃�ハ狥䖢","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋","輶䖙挿斃ぁ忋" 
} 

问题是,Visual Studio的2013年给它有关的各种错误。我已经将编码更改为没有BOM的UTF-8,否则编译器会立即崩溃,如果我尝试编译它。它给文本提供了各种错误,例如:'0x80':这个字符在标识符中是不允许的。我试图在文本之前添加u8,使其为UTF-8,例如:u8"ꖟ럵꼹ᐦෑ䵖"只能给出错误:未找到u8标识符

有没有一种方法可以将加密文本成功加载到源代码中?

+1

使用'wchar_t'或使每个字符成为转义序列。 – 2014-12-27 15:53:37

+0

好吧我会这样做 – 2014-12-27 16:02:56

+0

加密的输出不是一个有效的字符串,所以你不应该把它存储为一个char数组。如果你必须把它变成一个有效的字符串,你需要对它进行编码。 Base64编码是大多数应用程序的标准选择。 – 2014-12-27 18:30:25

回答

1

问题是AES产生的输出与随机无法区分。基本上这意味着任何字节都可以包含任何值。不是所有的字节值都是有效的字符编码。基本上你要求系统把二进制转换回字符,而二进制不是从字符开始构建的。

会发生什么情况是无法识别的字节编码被无声地删除。 不可打印的字符(如Unicode代码点0x20(32)以下的字符)可能会发生同样的情况。因此,最终将其解码为字符串并将其编码回字节将导致数据丢失。这种数据丢失当然也是随机发生的;对于较短的密文,你可能是幸运的,根本没有数据丢失。

现在如果你需要一个字符串,那么答案就是使用编码将二进制编码为字符串,然后再返回而不会丢失。对于一个相对有效的编码(每3个字节4个字符),大多数开发人员会使用base64。如果你只是想显示一些较小的值,那么十六进制将具有易于被人眼读取(每字节2个字符)的优点。对于密文的测试代码,密码和IV代码我个人总是更喜欢十六进制,因为它很容易看到/计算大小。

在诸如C/C++的语言中,您还可以使用\xXXunsigned char*中的所有内容进行编码。我会警告这种做法,因为它会哄你使用字符串函数,如strlen。如果使用空终止的字符串,这当然是一个问题。尽量保持字符和字节之间的明确区分,即使语言没有。更好的选择是使用char[](和sizeof而不是strlen)。